En la gráfica siguiente podemos observar que hay en total 4 variables que contienen registros vacios: estrato, estado civil, ingreso y proveedor.
A nivel individual el porcentaje de valores perdidos para todos los casos es superior al 25%. De forma combinada hay más del 30% de campos vacíos; por ende no podemos decir que la probabilidad de que falte un valor depende solo del valor observado, y usar un método para imputarlo (la forma no es aleatoria).

Dado lo anterior, se hace necesario construir una tercera categoría, por lo menos para las variables que poseen menos campos vacíos (estrato y estado civil).
Para estimar si existe una asociación entre las variables que pueda derivarse en colinealidad, se procede primero a verificar que las variables no poseen una distribución normal, una vez realizado esto, se elige el test de Spearman para hallar la correlación lineal por atributo.
Los resultados confirman que ninguna de las variables pesenta una distribución normal y las correlaciones relacionadas a continuación, verifican posibles asociaciones entre las variables de los días en que el paciente estuvo internado en la Unidad de Cuidados Intensivos, en la Unidad de Cuidados Especiales y los días que el paciente estuvo hospitalizado. Por conocimiento de facto, la relación entre la variable “dias_uci” y “dias_uce” es entendible, ya que cuando un paciente que ha pasado por la Unidad de Cuidados Intensivos pasó su momento de crisis y su estado de salud es más estable, suele ser remitido a la Unidad de Cuidados Especiales.

Sin embargo, las correlaciones obtenidas no cumplen un umbral suficiente para considerarlas importantes, por ende se procede a conservarlas y evaluar más adelante si es preciso eliminarlas definitivamente. Por otro lado, la variable categoría y diagnóstico están altamente correlacionadas con la variable endógena, por lo que es necesario eliminarlas del análisis, para no incurrir en posibles sobreajustes en la etapa de modelado.
Como se había mencionado anteriormente, teniendo en cuenta el análisis de datos perdidos o nulos, se decide descartar la variable ingreso ya que contiene mas de un 30% en datos perdidos.
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 34746 obs. of 12 variables:
$ edad : Factor w/ 7 levels "18-30","31-40",..: 3 4 7 1 5 3 2 7 2 7 ...
$ estrato : Factor w/ 7 levels "1","2","3","4",..: 7 4 5 3 7 6 7 7 4 4 ...
$ est_civil : Factor w/ 6 levels "C","D","S","Sin Informacion",..: 1 1 4 4 1 1 1 1 1 4 ...
$ genero : Factor w/ 2 levels "F","M": 1 2 1 1 2 1 2 2 1 1 ...
$ marcas : Factor w/ 3 levels "[0,2]","(2,4]",..: 1 1 1 1 1 1 1 1 1 1 ...
$ ramo : Factor w/ 2 levels "26","79": 1 1 1 2 1 1 1 1 1 2 ...
$ quirur : Factor w/ 2 levels "No","Si": 2 2 2 1 1 2 2 2 1 2 ...
$ dias_hosp : num 4 3 52 2 6 2 5 14 4 1 ...
$ dias_uci : num 0 0 0 0 0 0 0 0 0 0 ...
$ dias_uce : num 0 0 0 0 0 0 0 0 0 0 ...
$ pago_hosp : num 20604175 98000 2090823 1459979 246683 ...
$ rehosp_oms: num 0 0 0 0 0 0 0 0 0 0 ...
Volver al Índice
Es evidente la existencia también, de valores atípicos muy marcados tanto en el numéro de días de hospitalización, como en los números de días que el paciente estuvo en la Unidad de Cuidado Intensivo y Especial, en dónde los valores atípicos más grandes suceden en los eventos que no desencadenaron en rehospitalización.
Con el análisis anterior no sólo se logra identificar la presencia de valores atípicos, sino que también es posible evidenciar que los datos se encuentran altamente desbalanceados. En el caso de los outliers se truncará en los casos en que sea necesario, imputando los valores que superen cierto límite en el percentil, tanto mayor como menor.
Se puede observar que en la variable días UCI, correspondiente al primer diagnóstico, no parece haber una diferencia significativa en la distribución al discriminar por la variable objetivo binaria, es decir, entre los casos de rehospitalización (1) y casos de no rehospitalización (0). Adicionalmente, la distibución en ambas variables no es simétrica.
A pesar de que los datos se encuentran bastante dispersos, se logra identificar diferencias en la variable del pago -con valores más altos en los caso en que no terminó de buevo hospitalizado, y en el casó del número de días hospitalizado los rangos son mucho más pequeños cuando hay una rehospitalización.
Análisis variables categóricas
Observando las variables categóricas la diferencia entre la probabilidad de que el evento ocurra (haya rehospitalización) o no, se puede evidenciar sólo en algunas clases por categoría, pero en general, las proporciones suelen ser bastantes similares, por lo que no es posible elaborar a priori una hipótesis que estipule diferencias significativas en las distribuciones, por lo menos para ninguna de las dos variables relacionadas en el gráfico a continuación.

Por otro lado, el atributo que indica el hecho de que se hayan realizado procedimientos quirúrgicos durante la primera hospitalización muestran cierta diferencia en la distribuión por grupo; es más probable que la persona deba ser rehospitalizada de nuevo.

Con el objetivo de enriquecer el análisis exploratorio, se calcularán dos medidas muy comúnes de la teoría de la información, éstas permiten inferir algo del poder predictivo que pueden tener las variables independientes, antes de hacer parte de un modelo.
Volver al Índice
Análisis de clasificación binaria usando WOE y el IV
El peso de la evidencia (WOE) y el valor de la información (IV) ayudan, entre otras cosas, a determinar la contribución independiente de cada variable al resultado, y detectar relaciones lineales y no lineales. El WOE mide la relación entre la variable predictiva y el objeto binario, mientras que el IV mide la fuerza predictiva de esa relación.
La tabla a continuación contiene los valores del “valor de la información” con y sin el ajuste derivado de la validación cruzada. Cuando se realiza el ajuste con el objetivo de que los resultados sean más estables, tanto pago del diagnóstico, el hecho de que el paciente halla pasado por la Unidad de cuidados, y si fueron realizados procedimientos quirúrgicos serán las únicas variables con suficiente capacidad de predicción a nivel individual y univariable (Iv > 0.05). Cuando se relaja el supuesto, IV sin restar el penalty, se incluirían los días en que estuvo hospitalizado.
| |
Variable |
IV |
PENALTY |
AdjIV |
| 10 |
dias_uce |
3.2493169 |
0.5162541 |
2.7330628 |
| 9 |
dias_uci |
3.1969572 |
0.5881637 |
2.6087935 |
| 11 |
pago_hosp |
0.7340365 |
0.0828997 |
0.6511369 |
| 7 |
quirur |
0.3050877 |
0.0203025 |
0.2847852 |
| 8 |
dias_hosp |
0.0753638 |
0.0314285 |
0.0439353 |
| 4 |
genero |
0.0264964 |
0.0086772 |
0.0178192 |
| 5 |
marcas |
0.0051570 |
0.0014848 |
0.0036722 |
| 6 |
ramo |
0.0001644 |
0.0009926 |
-0.0008283 |
| 2 |
estrato |
0.0155690 |
0.0179440 |
-0.0023750 |
| 1 |
edad |
0.0248180 |
0.0273145 |
-0.0024965 |
| 3 |
est_civil |
0.0112672 |
0.0209304 |
-0.0096632 |
De acuerdo al poder predictivo de cada una de las variables, se eligen aquellas cuyo Valor de la informaciÓn (IV) sea superior al 2% (0,02). Las variables con IV inferiores a este valor se consideran impredictivas y se decide descartarlas. Las variables que continuan, en orden de relevancia segun su poder predictor, son:
-
pago_hosp
-
quirur
-
dias_uce
-
dias_uci
-
proveedor
-
dias_hosp
-
edad
-
genero
-
ciudad
Sin embargo, tanto la ciudad como el proveedor no serán tenidos en cuenta, por que pueden llegar a condicionar nuestra variable objetivo.
Enfocandonos en el pago del diagnóstico, el cual, es una de las variables con mayor influencia, el WOE nos indica una relación no lineal, con un incremento en el WOE a medida que disminuye el rango de pago en el diagnóstico.
| edad |
N |
Percent |
WOE |
IV |
PENALTY |
| 18-30 |
3516 |
0.1445605 |
-0.2939551 |
0.0108881 |
0.0095595 |
| 31-40 |
5221 |
0.2146616 |
0.1123261 |
0.0137465 |
0.0140510 |
| 41-50 |
4331 |
0.1780692 |
-0.1265459 |
0.0164325 |
0.0162139 |
| 51-60 |
4127 |
0.1696818 |
0.0708065 |
0.0173126 |
0.0205247 |
| 61-70 |
3252 |
0.1337061 |
-0.0337434 |
0.0174624 |
0.0216321 |
| 71-80 |
2270 |
0.0933311 |
0.0117238 |
0.0174753 |
0.0219054 |
| 81+ |
1605 |
0.0659896 |
0.3094369 |
0.0248180 |
0.0273145 |

Como se pudo observar en el analisis del WOE, esta técnica ajusta los valores de las variables numericas en rangos acotados de acuerdo al valor de la informacion de cada una de ellas en relacion con la variable dependiente. Por esto, es importante transformar dichas variables en los rangos recomendados.
Volver al Índice
Modelo
El objetivo principal del análisis es estimar un modelo predictivo con el cuál se pueda estimar la probabilidad de que un paciente termine en una rehospitalización, asociada a un diangóstico anterior. Para ello se empleará un modelo de regresión logística, el cuál es ampliamente utilizado para resolver problemas de clasificación binaria.
Una vez se realizan los filtros de calidad y completitud, y tras lo obtenido en los resultados del WOE, se procede a realizar la seleccion de variables para el modelo. Se tendrán en cuenta entonces, el pago realizado, los días en que estuvo el paciente de forma general, los días que permaneció en la Unidad de Cuidados -intensivos o especiales, el hecho de que se le haya realizado o no una cirugía, el género y la edad.
Para evaluar la capacidad de generalización del modelo, se dividirá el conjunto de datos en entrenamiento (70%) y prueba (30%).
Volver al Índice
Smote
Como se habia mencionado anteriormente, la informacion se encuentra desbalanceada; esto es, teniendo en cuenta que el problema en que se esta trabajando consiste en la clasificacion de una variable dicotómica, se debe analizar el nivel de representacion de sus posibles valores dentro del conjunto total de datos.
| Var1 |
Freq |
| 0 |
0.9774075 |
| 1 |
0.0225925 |
Vemos que la representacion para la categoría positiva es un poco mas del 2% de la información. En este caso vamos a realizar un tratamiento que permita aumentar la clase minoritaria, sin utilizar soluciones genéricas como reducir la clase mayoritaria al nivel de la clase menor.
Para ello, vamos a utilizar la técnica SMOTE (Synthetic Minority Oversampling Method), la cual genera nuevas instancias artificiales de la clase más pequeña interpolando los valores de las instancias minoritarias más cercanas a una dada.
Por medio de SMOTE se generará un nuevo set de datos de entrenamiento, en el cual se tenga un 60% de informacion para la categoria negativa (rehosp_oms = 0) y 40% para la categoria positiva (rehosp_oms = 0).
Verificamos que el set de entrenamiento se encuentre balanceado:
Volver al Índice
Ajuste del modelo y Estimación de parámetros
Del resultado exploratorio anterior, al discriminar el análisis de las variables independientes por nuestra variable objetivo (Rehospitalización), es posible evidenciar una diferencia clara entre las distribuciones para los atributos: Pago/costo del procedimiento y los días en que el usuario estuvo internado ya sea en la Unidad de Cuidados Intensivos o Especiales. Esto podría ser un indicio de que estas variables en particular, pueden llegar a ser relevantes para explicar la probabilidad de ocurrencia del evento, es decir, cuando hubo una hospitalización posterior ligada a un diagnóstico.
A continuación, al ajustar el modelo obtenemos los siguientes resultados:
Call:
glm(formula = rehosp_oms ~ pago_hosp + quirur + dias_hosp + edad +
genero, family = "binomial", data = training)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.4107 -1.0346 -0.7773 1.2084 3.1107
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.182668576143 0.089678064069 -2.037 0.04166 *
pago_hosp -0.000000126318 0.000000008531 -14.807 < 0.0000000000000002 ***
quirurSi 0.053210296155 0.058020131279 0.917 0.35909
dias_hosp -0.021884387306 0.008452670995 -2.589 0.00962 **
edad31-40 0.056188823662 0.095890774232 0.586 0.55790
edad41-50 0.015992755009 0.103539665142 0.154 0.87725
edad51-60 0.051854157445 0.101096214946 0.513 0.60801
edad61-70 0.007592983866 0.109069951038 0.070 0.94450
edad71-80 0.253801682916 0.117564546903 2.159 0.03086 *
edad81+ 0.345740565603 0.126207212906 2.739 0.00615 **
generoM 0.346200831739 0.056144103143 6.166 0.000000000699 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 7699.3 on 5719 degrees of freedom
Residual deviance: 7327.7 on 5709 degrees of freedom
AIC: 7349.7
Number of Fisher Scoring iterations: 4
- Cada cambio en una unidad en el pago hospitalario disminuirá las probabilidades de rehospitalización, pero en una cantidad muy pequeña (-6.953E-08)
- Cuando a un paciente se le realiza un procedimiento quirúrgico su probabilidad de que termine hospitalizado de nuevo por el mismo diagnóstico, disminuye en más del 19% en comparación a cuando no se le realiza ninguna cirugía.
- La probabilidad de rehospitalización decrece, al permanecer un día adicional el paciente en la UCE (en 1.45) y la UCI (1.73)
El resto de las variables no son suficientemente explicativas para predecir, de manera significativa, su efecto sobre la variable de respuesta binaria.
Después de estimados los coeficentes se procede a realizar la predicción dentro y fuera de muestra para evaluar la precisión (accuracy) y capacidad de generalización de nuestro modelo.
Los resultados indican un nivel de accuracy sospechosamente elevado, inluso el modelo parece ajustarse mejor con los datos nuevos, que en la parte de entrenamiento. Para ver en detalle como se comporta, al discriminar entre los casos en que el paciente sale definitivamente o termina en una rehospitalización, y evidenciar su desempeño por separado, se estimará la matriz de confusión:
table(as.matrix(testing[, 7]), y_pred > 0.5)
Los resultados no parecen indicar que éste comportamiento se den a causa del desbalanceo. Por un lado tenemos que la sencibilidad y la especificidad corresponden al 96% y 99%. Si se habla en términos de precisión, sería de de un 99% cuando es 0, es decir de un total de 10218 pacientes que no terminaron en hospitalización pude predecir con una exactitud que el 99% no lo harían, mientras que de 249 pacientes que si tubieron una rehospitalización pude predecir que 210 efectivamente lo harían, es decir, mi precisión fue del 84%.
Sin embargo, no sólo por los resultados obtenidos con el ajuste del modelo, sino también con lo que veíamos anteriormente en la tabla del valor de la información, las variables días UCI y días UCE parecen explicar de manera casi perfecta la probabilidad de que ocurre un evento rehospitalario y esto puede deberse …….. por ende se decide estimar el modelo sin incluirlas.
A continuación, se obtienen los resultados:
mylogit_2 <- glm(rehosp_oms ~ pago_hosp + quirur + dias_hosp + estrato, data = training, family = "binomial")
summary(mylogit)
pred_train <- predict(mylogit_2, newdata = training[-7], type = "response")
y_pred_train <- ifelse(pred_train > 0.5, 1, 0)
y_act_train <- training$rehosp_oms
pred = predict(mylogit_2, type = 'response', newdata = testing[-7])
y_pred = ifelse(pred > 0.5, 1, 0)
y_act <- testing$rehosp_oms
kable(data.frame(Train = mean(y_pred_train == y_act_train), Test = mean(y_pred == y_act))) %>%
kable_styling(position = "center",
row_label_position = 1,
full_width = F) %>%
row_spec(0,background="#EBF0F7")
table(as.matrix(testing[, 7]), y_pred > 0.5)
tapply(pred_train, training[,7], FUN = median)
Sensibilidad = 210/218
Sensibilidad
especificidad = 10243/10251
especificidad
Accuracy = (10243 + 210)/10469
Accuracy
LS0tDQp0aXRsZTogIjxzcGFuIHN0eWxlPSdjb2xvcjojMzA1ZjcyJz48Y2VudGVyPjxicj5Nb2RlbG8gZGUgUHJlZGljY2nDs24gUmVob3NwaXRhbGl6YWNpw7NuPC9jZW50ZXI+Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpkYXRlOiAiPGNlbnRlcj5BYnJpbCAyMDE5PC9jZW50ZXI+Ig0KYXV0aG9yOiAiPGNlbnRlcj48YSBocmVmPSdtYWlsdG86YW5kcmVzLmdvbnphbGV6QGRhdGFseXRpY3MuY29tJz5BbmRyw6lzIEZlbGlwZSBHb256w6FsZXo8L2E+PC9jZW50ZXI+Ig0KLS0tDQoNCjxocj4NCjx0YWJsZT4NCjx0cj4NCjx0ZD48aW1nIHN0eWxlPSJ3aWR0aDoyODBweDsgaGVpZ2h0OjIwMHB4OyIgc3JjPSJTVVJBLnBuZyIgLz48L3RkPg0KPHRkPjxpbWcgc3R5bGU9IndpZHRoOjIwMHB4OyBoZWlnaHQ6MTUwcHg7IiBzcmM9ImJsYW5jby5qcGciIC8+PC90ZD4NCjx0ZD48aW1nIHN0eWxlPSJ3aWR0aDozNjBweDsgaGVpZ2h0OjEwMHB4OyIgc3JjPSJEYXRhbHl0aWNzLnBuZyIgLz48L3RkPg0KPC90cj4NCjwvdGFibGU+DQo8aHI+DQoNCjxoMyBpZD0iaW5kaWNlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPsONbmRpY2U8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIHByZXNlbnRlIG5vdGVib29rIGNvbnRpZW5lIGluZm9ybWFjacOzbiByZWxhY2lvbmFkYSBhbCBlbnRlbmRpbWllbnRvIGRlIGxvcyBkYXRvcyB5IHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGRlIHVuIG1vZGVsbyBkZSBwcmVkaWNjacOzbiBwYXJhIGVsIHByb2JsZW1hIGRlIHJlaG9zcGl0YWxpemFjacOzbi4NCg0KPG9sPg0KICAgIDxsaT48YSBocmVmPSIjR2VuZXJhbGlkYWRlcyI+R2VuZXJhbGlkYWRlczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjRW50ZW5kaW1pZW50byI+RW50ZW5kaW1pZW50byBkZSBsb3MgZGF0b3M8L2E+PC9saT4NCiAgICA8bGk+PGEgaHJlZj0iI1BlcmRpZG9zIj5BbsOhbGlzaXMgZGUgUmVnaXN0cm9zIFDDqXJkaWRvczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjQW5hbGlzaXMiPkFuw6FsaXNpcyBFeHBsb3JhdG9yaW88L2E+PC9saT4NCiAgICAgIDxvbD4NCiAgICAgICAgPGxpPjxhIGhyZWY9IiNBbmFsaXNpc0NvbiI+QW7DoWxpc2lzIHVuaXZhcmlhZG8gLSB2YXJpYWJsZXMgY29udGludWFzPC9hPjwvbGk+DQogICAgICAgIDxsaT48YSBocmVmPSIjQW5hbGlzaXNDYXIiPkFuw6FsaXNpcyB1bml2YXJpYWRvIC0gdmFyaWFibGVzIGNhcmRpbmFsZXM8L2E+PC9saT4NCiAgICAgIDwvb2w+DQogICAgPGxpPjxhIGhyZWY9IiNBbmFsaXNpc1dPRSI+QW7DoWxpc2lzIGRlIGNsYXNpZmljYWNpw7NuIGJpbmFyaWEgdXNhbmRvIFdPRSB5IGVsIElWPC9hPjwvbGk+DQogICAgPGxpPjxhIGhyZWY9IiNNb2RlbG8iPk1vZGVsbzwvYT48L2xpPg0KICAgICAgPG9sPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI1NNT1RFIj5TTU9URSAtIEJhbGFuY2VvIGRlIGNhdGVnb3JpYSBtaW5vcml0YXJpYTwvYT48L2xpPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI0FqdXN0ZW1vZCI+QWp1c3RlIGRlbCBtb2RlbG8geSBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvczwvYT48L2xpPg0KICAgICAgICA8bGk+PGEgaHJlZj0iI0V2YWx1YWNpb24iPlByZWRpY2llbmRvIHkgZXZhbHVhbmRvIGVsIGRlc2VtcGXDsW8gZGVsIG1vZGVsbzwvYT48L2xpPg0KICAgICAgPC9vbD4NCiAgICA8bGk+PGEgaHJlZj0iI0NvbmNsdXNpb25lcyI+UmVzdWx0YWRvcyB5IENvbmNsdXNpb25lczwvYT48L2xpPg0KICAgIDxsaT48YSBocmVmPSIjUmVjb21lbmRhY2lvbiI+UmVjb21lbmRhY2lvbmVzIHkgRXN0cmF0ZWdpYXM8L2E+PC9saT4NCjwvb2w+DQoNCkhhY2llbmRvIGNsaWNrIHNvYnJlIGNhZGEgdW5hIGRlIGxhcyBzZWNjaW9uZXMgcHVlZGUgaXIgZGlyZWN0YW1lbnRlIGEgY2FkYSB1bmEgZGUgZWxsYXMuIEFsIGZpbmFsaXphciBjYWRhIHNlY2Npw7NuIGVuY29udHJhcsOhIHVuIGxpbmsgcGFyYSB2b2x2ZXIgYWwgw61uZGljZS48L2Rpdj4NCjxocj4NCg0KPGgzIGlkPSJHZW5lcmFsaWRhZGVzIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPkdlbmVyYWxpZGFkZXM8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIG9iamV0aXZvIGVzIGRlc2Fycm9sbGFyIGUgaW1wbGVtZW50YXIgdW4gbW9kZWxvIGRlIHByZWRpY2Npw7NuIGRlIHJlaG9zcGl0YWxpemFjaW9uZXMgcGFyYSBhcG95YXIgbG9zIHByb2dyYW1hcyBkZSBldml0YWJpbGlkYWQgcG9zdC1ob3NwaXRhbGFyaWEuIEVsIGFuw6FsaXNpcyBzZSByZWFsaXphcsOhIGNvbiBpbmZvcm1hY2nDs24gcXVlIGRlc2NyaWJlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIHNvY2lvZGVtb2dyw6FmaWNhcyBkZWwgaW5kaXZpZHVvIHkgY29uIGFsZ3Vub3MgZGF0b3MgcmVjb2xlY3RhZG9zIHBvciBlbCBwZXJzb25hbCBob3NwaXRhbGFyaW87IHBhcmEgdW4gcGVyaW9kbyBkZSB0aWVtcG8gZGUgZG9zIGHDsW9zIHkgbWVkaW8sIHF1ZSB2YSBkZXNkZSAyMDE2IGhhc3RhIDIwMTguDQoNCltWb2x2ZXIgYWwgw41uZGljZV0oI2luZGljZSk8L2Rpdj4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQpybShsaXN0ID0gbHMoKSkNCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQpzb3VyY2UoImZ1bmN0aW9uc19wbG90LlIiKQ0KDQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoInJlYWR4bCIsICJkcGx5ciIsICJnZ3Bsb3QyIiwgImdnY29ycnBsb3QiLCAiVklNIiwgIlJDb2xvckJyZXdlciIsICJJbmZvcm1hdGlvbiIsICJrbml0ciIsICJrYWJsZUV4dHJhIiwgImdyaWRFeHRyYSIsICJza2ltciIsICJub3J0ZXN0IiwgIkdHYWxseSIsICJwbG90bHkiLCAibGF0dGljZSIsICJETXdSIiwgImNhVG9vbHMiLCAicGxvdGx5IikNCg0KbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbIShsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQ0KDQpsb2FkIDwtIGxhcHBseShsaXN0Lm9mLnBhY2thZ2VzLCBsaWJyYXJ5LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQpgYGANCg0KPGhyPg0KPGgzIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBpZD0iRW50ZW5kaW1pZW50byIgbWFya2Rvd24gPSAiMSI+RW50ZW5kaW1pZW50byBkZSBsb3MgZGF0b3M8L2gzPg0KPGRpdiBzdHlsZT0gInRleHQtYWxpZ246anVzdGlmeSI+IA0KDQpFbCBhcmNoaXZvIGNvbnRpZW5lIHJlZ2lzdHJvcyBxdWUgY29ycmVzcG9uZGVuIGEgZXZlbnRvcyBkZSByZWhvc3BpdGFsaXphY2lvbmVzIHkgc2UgZW5jdWVudHJhIGRldGFsbGFkbyBhIG5pdmVsIGRlIGNhZGEgZXZlbnRvIGhvc3BpdGFsYXJpby4gRW4gdG90YWwgc29uIDM0ODk4IHJlZ2lzdHJvcywgMTggdmFyaWFibGVzLCBkZXNjYXJ0YW5kbyBkZSBtYW5lcmEgaW5pY2lhbCwgYXF1ZWxsb3MgYXRyaWJ1dG9zIHF1ZSBzZSBkZXJpdmFuIGRlc3B1w6lzIGRlbCBzZWd1bmRvIGRpYWduw7NzdGljbzsgbG9zIGRhdG9zIHNlIGRlc2NyaWJlbiBhIGNvbnRpbnVhY2nDs246DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KZGF0YV9yZWhvc3AgPC0gcmVhZF94bHN4KCJEQVRBX1JFSE9TUC54bHN4IixuYSA9IGMoIm5hIiwgIk5BIiwgIm51bGwiLCAiTlVMTCIpKQ0KZGF0YV9yZWhvc3AgJT4lDQogIHNlbGVjdChFZGFkX0hvc3BpdGFsaXphY2lvbiwNCiAgICAgICAgIEVzdHJhdG9fVml2aWVuZGEsDQogICAgICAgICBSYW5nb19JbmdyZXNvc19EZXNjLA0KICAgICAgICAgRXN0YWRvX0NpdmlsLA0KICAgICAgICAgR2VuZXJvLA0KICAgICAgICAgY2FudGlkYWRfbWFyY2FzLA0KICAgICAgICAgUmFtb19JZCwNCiAgICAgICAgIENpdWRhZF9Db250YWN0b19Ob21icmUsDQogICAgICAgICBDb2RpZ29fRGlhZ25vc3RpY29fT3AsDQogICAgICAgICBDYXRlZ29yaWFfRHhfSWQsDQogICAgICAgICBRdWlydXJnaWNvLA0KICAgICAgICAgRmVjaGFfSW5ncmVzb19Ib3NwLA0KICAgICAgICAgTnVtZXJvX0RpYXNfSG9zcGl0YWxhcmlvLA0KICAgICAgICAgTnVtZXJvX0RpYXNfVWNpLA0KICAgICAgICAgTnVtZXJvX0RpYXNfVWNlLA0KICAgICAgICAgUHJvdmVlZG9yLA0KICAgICAgICAgVmFsb3JfUGFnYWRvX0RpYWdub3N0aWNvLA0KICAgICAgICAgcmVob3NwX2NhdF9vbXMpICU+JQ0KICByZW5hbWUoZWRhZCA9IEVkYWRfSG9zcGl0YWxpemFjaW9uLCANCiAgICAgICAgIGVzdHJhdG8gPSBFc3RyYXRvX1ZpdmllbmRhLA0KICAgICAgICAgaW5ncmVzbyA9IFJhbmdvX0luZ3Jlc29zX0Rlc2MsDQogICAgICAgICBlc3RfY2l2aWwgPSBFc3RhZG9fQ2l2aWwsDQogICAgICAgICBnZW5lcm8gPSBHZW5lcm8sDQogICAgICAgICBtYXJjYXMgPSBjYW50aWRhZF9tYXJjYXMsDQogICAgICAgICByYW1vID0gUmFtb19JZCwNCiAgICAgICAgIGNpdWRhZCA9IENpdWRhZF9Db250YWN0b19Ob21icmUsDQogICAgICAgICBkaWFnbm9zID0gQ29kaWdvX0RpYWdub3N0aWNvX09wLA0KICAgICAgICAgY2F0ZWdvcmlhID0gQ2F0ZWdvcmlhX0R4X0lkLA0KICAgICAgICAgcXVpcnVyID0gUXVpcnVyZ2ljbywNCiAgICAgICAgIGZlY2hhX2luZ3Jlc28gPSBGZWNoYV9JbmdyZXNvX0hvc3AsDQogICAgICAgICBkaWFzX2hvc3AgPSBOdW1lcm9fRGlhc19Ib3NwaXRhbGFyaW8sDQogICAgICAgICBkaWFzX3VjaSA9IE51bWVyb19EaWFzX1VjaSwNCiAgICAgICAgIGRpYXNfdWNlID0gTnVtZXJvX0RpYXNfVWNlLA0KICAgICAgICAgcHJvdmVlZG9yID0gUHJvdmVlZG9yLA0KICAgICAgICAgcGFnb19ob3NwID0gVmFsb3JfUGFnYWRvX0RpYWdub3N0aWNvLA0KICAgICAgICAgcmVob3NwX29tcyA9IHJlaG9zcF9jYXRfb21zKSAtPiBkYXRhX3JlaG9zcA0KaGVhZChkYXRhX3JlaG9zcCkNCmBgYA0KDQo8dWw+DQo8bGk+VmFyaWFibGVzIGNvbnRpbnVhcyAoNCkNCjx1bD4NCjxsaT5kaWFzX2hvc3A6IGTDrWFzIGRlIGhvc3BpdGFsaXphY2nDs248L2xpPg0KPGxpPmRpYXNfdWNpOiBuw7ptZXJvIGTDrWFzIGVuIFVDSTwvbGk+DQo8bGk+ZGlhc191Y2U6IG7Dum1lcm8gZMOtYXMgZW4gVUNFPC9saT4NCjxsaT5wYWdvX2hvc3A6IHZhbG9yIHBhZ2FkbyBwcmltZXJhIGhvc3BpdGFsaXphY2nDs248L2xpPg0KPC91bD4NCjwvbGk+DQo8L3VsPg0KPHVsPg0KPGxpPlZhcmlhYmxlcyBub21pbmFsZXMgKDUpDQo8dWw+DQo8bGk+ZXN0cmF0bzogZXN0cmF0byBWaXZpZW5kYSAoMCwxLDIsMyw0LDUsNiwtMSk8L2xpPg0KPGxpPmVzdF9jaXZpbDogZXN0YWRvIGNpdmlsIChDLEQsUyxVLFYsLTEpPC9saT4NCjxsaT5jaXVkYWQ6IGNpdWRhZCBkZSBjb250YWN0byBkZWwgYXNlZ3VyYWRvPC9saT4NCjxsaT5kaWFnbm9zOiBjw7NkaWdvIGRpYWduw7NzdGljbyBDSUUxMCBkZSBsYSBwcmltZXJhIGF0ZW5jacOzbiA8L2xpPg0KPGxpPmNhdGVnb3JpYTogY2F0ZWdvcsOtYSBkZWwgZGlhZ27Ds3N0aWNvIHNlZ8O6biBlbCB0aXBvIGRlIGVuZmVybWVkYWQ8L2xpPg0KPC91bD4NCjwvbGk+DQo8L3VsPg0KPHVsPg0KPGxpPlZhcmlhYmxlIGRpY290w7NtaWNhICg0KQ0KPHVsPg0KPGxpPmdlbmVybzogZ8OpbmVybyBkZWwgYXNlZ3VyYWRvIChNLEYpPC9saT4NCjxsaT5yYW1vOiByYW1vIGFsIHF1ZSBwZXJ0ZW5lY2UgZWwgYXNlZ3VyYWRvPC9saT4NCjxsaT5xdWlydXI6IHNpIHR1dm8gYWxndW4gdGlwbyBkZSBzZXJ2aWNpbyByZWxhY2lvbmFkbyBhIHByb2NlZGltaWVudG8gcXVpcsO6cmdpY288L2xpPg0KPGxpPnJlaG9zcF9jYXRfb21zOiBzaW1pbGl0dWQgY2F0ZWdvcsOtYSBjaWUxMC4gRXN0YSBlcyBudWVzdHJhIHZhcmlhYmxlIG9iamV0aXZvIDwvbGk+DQo8L3VsPg0KPC9saT4NCjwvdWw+DQo8dWw+DQo8bGk+VmFyaWFibGVzIGRpc2NyZXRhcyAoMikNCjx1bD4NCjxsaT5lZGFkOiBlZGFkIGRlbCBhc2VndXJhZG8gZW4gZWwgbW9tZW50byBkZSBsYSBob3NwaXRhbGl6YWNpw7NuPC9saT4NCjxsaT5tYXJjYXM6IGNhbnRpZGFkIGRlIG1hcmNhcyBjb25maXJtYWRhcyBkZWwgYXNlZ3VyYWRvPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCjx1bD4NCjxsaT5WYXJpYWJsZXMgb3JkaW5hbGVzICgxKQ0KPHVsPg0KPGxpPmluZ3Jlc286IHJhbmdvIGRlIGluZ3Jlc29zPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCjx1bD4NCjxsaT5GZWNoYSAoMSkNCjx1bD4NCjxsaT5GZWNoYV9JbmdyZXNvOiBmZWNoYSBpbmdyZXNvIGhvc3BpdGFsaXphY2nDs24gPC9saT4NCjwvdWw+DQo8L2xpPg0KPC91bD4NCg0KR2VuZXJhbW9zIGxhIGVzdGFkw61zdGljYSBkZXNjcmlwdGl2YTsgZW4gZWxsYSBzZSBwdWVkZSB2aXN1YWxpemFyIHF1ZSBzZXLDoSBuZWNlc2FyaW8gcmVhbGl6YXIgbcOhcyBhZGVsYW50ZSBhbGd1bmFzIGNvbnZlcnNpb25lcyBlbiBsb3MgdGlwb3MgZGUgZGF0b3MgcXVlIHZpZW5lbiBwb3IgZGVmZWN0byAocG9yIGVqZW1wbG8gZWwgZXN0cmF0byBhcGFyZWNlIGNvbW8gdW5hIHZhcmlhYmxlIG51bcOpcmljYSkuIFBlcm8gYW50ZXMgZGUgY29udGludWFyIGNvbiBsYSBjb2RpZmljYWNpw7NuLCBwcm9jZWRlcmVtb3MgYSBvYnNlcnZhciBjb21vIHNlIGVuY3VlbnRyYW4gbnVlc3RyYXMgdmFyaWFibGVzLg0KDQo8YnI+DQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0Kc2tpbV93aXRoKG51bWVyaWMgPSBsaXN0KGhpc3QgPSBOVUxMKSkNCg0KZGF0YV9yZWhvc3AgJT4lIA0KICBncm91cF9ieSgpICU+JQ0KICBza2ltKCkNCmBgYA0KDQo8dWw+DQo8bGk+TGEgdmFyaWFibGUgaW5ncmVzbyBlcyBsYSBxdWUgbcOhcyBkYXRvcyBwZXJkaWRvcyB0aWVuZSwgc2VndWlkYSBkZWwgZXN0cmF0by4NCjxsaT5MYSBtYXlvcsOtYSBkZSBsb3MgcGFjaWVudGVzIG5vIGVzdHV2aWVyb24gaW5ncmVzYWRvcyBlbiBlbCBVQ0kgbyBlbiBVQ0UNCjxsaT5FbCBwYWdvIGhvc3BpdGFsYXJpbyBwcm9tZWRpbyBmdWUgZGUgJDUnNzA2LDEwOCBjb24gdW5hIGRlc3ZpYWNpw7NuIGRlICQxMSc0NDcsMTM1IGRlIGxhIG1lZGlhLCBsbyBxdWUgaW5kaWNhIHVuYSBncmFuIGRpc3BlcnNpw7NuIGVuIGxvcyBkYXRvcywgeSBwb3NpYmxlIHByZXNlbmNpYSBkZSBvdXRsaWVycy4NCjxsaT5FbCA3NSUgZGUgbGEgaW5mb3JtYWNpw7NuIGNvcnJlc3BvbmRlIGEgdXN1YXJpb3MgcXVlIG5vIHNlIHJlaG9zcGl0YWxpemFyb24sIHBvciBlbmRlIG51ZXN0cmEgdmFyaWFibGUgb2JqZXRpdm8gc2UgZW5jdWVudHJhIGRlc2JhbGFuY2VhZGENCjx1bD4NCg0KPGJyPg0KDQpBIGNvbnRpbnVhY2lvbiB2ZXJlbW9zIGFsZ3VuYXMgZ3JhZmljYXMgcXVlIHBlcm1pdGVuIHJlYWxpemFyIGluZmVyZW5jaWFzIGFjZXJjYSBkZWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIGRhdG9zOg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUUsIGZpZy53aWR0aD04fQ0KcmVxdWlyZShzY2FsZXMpDQoNCmRhdGFfcmVob3NwICU+JQ0KICBmaWx0ZXIocGFnb19ob3NwID4gMCAmIHF1aXJ1ciA9PSAwICYgcmVob3NwX29tcyA9PSAxKSAlPiUNCiAgZ3JvdXBfYnkoZmVjaGFfaW5ncmVzbykgJT4lDQogIHN1bW1hcmlzZV9hbGwofnN1bShwYWdvX2hvc3ApKSAlPiUNCiAgICBnZ3Bsb3QoDQogICAgICBhZXMoDQogICAgICAgIHg9ZmVjaGFfaW5ncmVzbywgDQogICAgICAgIHk9cGFnb19ob3NwKSkgKw0KICAgIGdlb21fbGluZSgNCiAgICAgIGNvbG9yID0gIiM5OUNDRkYiLCANCiAgICAgIHNpemUgPSAwLjMpICsgDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKyANCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIGxhYnModGl0bGUgPSAiUGFnbyBIb3NwIGVuIGVsIHRpZW1wbyIsDQogICAgICAgICB4PSAiRmVjaGEgSW5ncmVzbyIsDQogICAgICAgICB5ID0gIlBhZ28gSG9zcCIpICsNCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgDQogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgLT4gcDExDQoNCnAxMSA8LSBnZ3Bsb3RseShwMTEpDQpwMTENCmBgYA0KDQpgYGB7cn0NCmRhdGFfcmVob3NwICU+JQ0KICBncm91cF9ieShjaXVkYWQpICU+JQ0KICBzdW1tYXJpc2VfYWxsKH5zdW0ocmVob3NwX29tcykpICU+JQ0KICBmaWx0ZXIocmVob3NwX29tcyA+IDgpICU+JQ0KICAgIGdncGxvdCgNCiAgICAgIGFlcyhmaWxsPWNpdWRhZCwNCiAgICAgICAgICB4PWNpdWRhZCwgDQogICAgICAgICAgeT1yZWhvc3Bfb21zKSkgKw0KICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIA0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgbGFicyh0aXRsZSA9ICJSZWhvc3BpdGFsaXphY2lvbiBwb3IgY2l1ZGFkIiwNCiAgICAgICAgIHg9ICJDaXVkYWQiLA0KICAgICAgICAgeSA9ICJDYW50LiBSZWhvc3AiKSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIpLT4gcDEyDQoNCnAxMiA8LSBnZ3Bsb3RseShwMTIpDQpwMTINCg0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQ0KIHJlcXVpcmUoc2NhbGVzKQ0KIA0KZGF0YV9yZWhvc3AgJT4lDQogIGZpbHRlcihyZWhvc3Bfb21zID4gMCkgJT4lDQogIGdyb3VwX2J5KGZlY2hhX2luZ3Jlc28pICU+JQ0KICBzdW1tYXJpc2VfYWxsKH5zdW0ocmVob3NwX29tcykpICU+JQ0KICAgIGdncGxvdCgNCiAgICAgIGFlcygNCiAgICAgICAgeD1mZWNoYV9pbmdyZXNvLCANCiAgICAgICAgeT1yZWhvc3Bfb21zKSkgKw0KICAgIGdlb21fcG9pbnQoY29sb3I9IiM5OUNDRkYiLCANCiAgICAgIHNpemU9MikgKyANCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArIA0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgbGFicyh0aXRsZSA9ICJOdW1lcm8gUmVob3NwIGVuIGVsIHRpZW1wbyIsDQogICAgICAgIHg9ICJGZWNoYSBSZWhvc3AuIiwNCiAgICAgICAgeSA9ICJOdW0uIFJlaG9zcC4iKSArDQogICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgLT4gcDEzDQogDQpwMTMgPC0gZ2dwbG90bHkocDEzKQ0KcDEzDQpgYGANCg0KW1ZvbHZlciBhbCDDjW5kaWNlXSgjaW5kaWNlKTwvZGl2Pg0KDQo8aHI+DQo8aDIgaWQ9IlBlcmRpZG9zIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPkdlbmVyYWxpZGFkZXM8L2gyPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVuIGxhIGdyw6FmaWNhIHNpZ3VpZW50ZSBwb2RlbW9zIG9ic2VydmFyIHF1ZSBoYXkgZW4gdG90YWwgNCB2YXJpYWJsZXMgcXVlIGNvbnRpZW5lbiByZWdpc3Ryb3MgdmFjaW9zOiBlc3RyYXRvLCBlc3RhZG8gY2l2aWwsIGluZ3Jlc28geSBwcm92ZWVkb3IuDQoNCkEgbml2ZWwgaW5kaXZpZHVhbCBlbCBwb3JjZW50YWplIGRlIHZhbG9yZXMgcGVyZGlkb3MgcGFyYSB0b2RvcyBsb3MgY2Fzb3MgZXMgc3VwZXJpb3IgYWwgMjUlLiBEZSBmb3JtYSBjb21iaW5hZGEgaGF5IG3DoXMgZGVsIDMwJSBkZSBjYW1wb3MgdmFjw61vczsgcG9yIGVuZGUgbm8gcG9kZW1vcyBkZWNpciBxdWUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBmYWx0ZSB1biB2YWxvciBkZXBlbmRlIHNvbG8gZGVsIHZhbG9yIG9ic2VydmFkbywgeSB1c2FyIHVuIG3DqXRvZG8gcGFyYSBpbXB1dGFybG8gKGxhIGZvcm1hIG5vIGVzIGFsZWF0b3JpYSkuDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZXZhbCA9VFJVRSwgZWNobyA9IEZBTFNFfQ0KYWdncihkYXRhX3JlaG9zcCwNCiAgICAgY29sID0gYygiI0NDRTVGRiIsICIjOTlDQ0ZGIiksDQogICAgIGNleC5heGlzID0gMC43LA0KICAgICBwcm9wID0gYyhUUlVFLCBGQUxTRSksDQogICAgIG51bWJlciA9IFRSVUUsDQogICAgIGdhcCA9IDEuNSwNCiAgICAgYm9yZGVyID0gTkEsDQogICAgIGJhcnMgPSBGQUxTRSwNCiAgICAgeWxhYiA9IGMoIlByb3BvcmNpw7NuIGRlIERhdG9zIFBlcmRpZG9zIiwgIkNvbWJpbmFjaW9uZXMiKSkNCmBgYA0KDQpEYWRvIGxvIGFudGVyaW9yLCBzZSBoYWNlIG5lY2VzYXJpbyBjb25zdHJ1aXIgdW5hIHRlcmNlcmEgY2F0ZWdvcsOtYSwgcG9yIGxvIG1lbm9zIHBhcmEgbGFzIHZhcmlhYmxlcyBxdWUgcG9zZWVuIG1lbm9zIGNhbXBvcyB2YWPDrW9zIChlc3RyYXRvIHkgZXN0YWRvIGNpdmlsKS4NCg0KUGFyYSBlc3RpbWFyIHNpIGV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBxdWUgcHVlZGEgZGVyaXZhcnNlIGVuIGNvbGluZWFsaWRhZCwgc2UgcHJvY2VkZSBwcmltZXJvIGEgdmVyaWZpY2FyIHF1ZSBsYXMgdmFyaWFibGVzIG5vIHBvc2VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIHVuYSB2ZXogcmVhbGl6YWRvIGVzdG8sIHNlIGVsaWdlIGVsIHRlc3QgZGUgU3BlYXJtYW4gcGFyYSBoYWxsYXIgbGEgY29ycmVsYWNpw7NuIGxpbmVhbCBwb3IgYXRyaWJ1dG8uDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KZGF0YV9yZWhvc3AgJT4lDQogIHNlbGVjdChwYWdvX2hvc3AsIA0KICAgICAgICAgZGlhc191Y2ksDQogICAgICAgICBkaWFzX3VjZSwNCiAgICAgICAgIGRpYXNfaG9zcCwNCiAgICAgICAgIHJlaG9zcF9vbXMpIC0+IGRhdGFfbnVtDQoNCm5vcm1fdGVzdCA8LSBsYXBwbHkoZGF0YV9udW0sIGxpbGxpZS50ZXN0KQ0KbHJlcyA8LSBzYXBwbHkobm9ybV90ZXN0LCBgW2AsIGMoInN0YXRpc3RpYyIsInAudmFsdWUiKSkNCnQobHJlcykNCmBgYA0KDQpMb3MgcmVzdWx0YWRvcyBjb25maXJtYW4gcXVlIG5pbmd1bmEgZGUgbGFzIHZhcmlhYmxlcyBwZXNlbnRhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCB5IGxhcyBjb3JyZWxhY2lvbmVzIHJlbGFjaW9uYWRhcyBhIGNvbnRpbnVhY2nDs24sIHZlcmlmaWNhbiBwb3NpYmxlcyBhc29jaWFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcyBkZSBsb3MgZMOtYXMgZW4gcXVlIGVsIHBhY2llbnRlIGVzdHV2byBpbnRlcm5hZG8gZW4gbGEgVW5pZGFkIGRlIEN1aWRhZG9zIEludGVuc2l2b3MsIGVuIGxhIFVuaWRhZCBkZSBDdWlkYWRvcyBFc3BlY2lhbGVzIHkgbG9zIGTDrWFzIHF1ZSBlbCBwYWNpZW50ZSBlc3R1dm8gaG9zcGl0YWxpemFkby4gUG9yIGNvbm9jaW1pZW50byBkZSBmYWN0bywgbGEgcmVsYWNpw7NuIGVudHJlIGxhIHZhcmlhYmxlICJkaWFzX3VjaSIgeSAiZGlhc191Y2UiIGVzIGVudGVuZGlibGUsIHlhIHF1ZSBjdWFuZG8gdW4gcGFjaWVudGUgcXVlIGhhIHBhc2FkbyBwb3IgbGEgVW5pZGFkIGRlIEN1aWRhZG9zIEludGVuc2l2b3MgcGFzw7Mgc3UgbW9tZW50byBkZSBjcmlzaXMgeSBzdSBlc3RhZG8gZGUgc2FsdWQgZXMgbcOhcyBlc3RhYmxlLCBzdWVsZSBzZXIgcmVtaXRpZG8gYSBsYSBVbmlkYWQgZGUgQ3VpZGFkb3MgRXNwZWNpYWxlcy4gDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KY29ycl9udW0gPC0gcm91bmQoY29yKGRhdGFfbnVtKSw0KQ0KcC5tYXQgPC0gY29yX3BtYXQoZGF0YV9udW0sIG1ldGhvZCA9ICJzcGVhcm1hbiIpDQoNCmdnY29ycnBsb3QoY29ycl9udW0sIA0KICAgICAgICAgICB0eXBlID0gImxvd2VyIiwNCiAgICAgICAgICAgb3V0bGluZS5jb2wgPSAid2hpdGUiLA0KICAgICAgICAgICBwLm1hdCA9IHAubWF0LA0KICAgICAgICAgICBzaWcubGV2ZWwgPSAwLjA1LA0KICAgICAgICAgICBnZ3RoZW1lID0gZ2dwbG90Mjo6dGhlbWVfbWluaW1hbCwNCiAgICAgICAgICAgbGFiID0gVFJVRSwNCiAgICAgICAgICAgY29sb3JzID0gYygiIzk5Q0NGRiIsICJ3aGl0ZSIsICIjMDA2NkNDIikpICsgDQogIGxhYnModGl0bGUgPSAiQ29ycmVsYWNpb24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXMiKQ0KYGBgDQoNClNpbiBlbWJhcmdvLCBsYXMgY29ycmVsYWNpb25lcyBvYnRlbmlkYXMgbm8gY3VtcGxlbiB1biB1bWJyYWwgc3VmaWNpZW50ZSBwYXJhIGNvbnNpZGVyYXJsYXMgaW1wb3J0YW50ZXMsIHBvciBlbmRlIHNlIHByb2NlZGUgYSBjb25zZXJ2YXJsYXMgeSBldmFsdWFyIG3DoXMgYWRlbGFudGUgc2kgZXMgcHJlY2lzbyBlbGltaW5hcmxhcyBkZWZpbml0aXZhbWVudGUuIFBvciBvdHJvIGxhZG8sIGxhIHZhcmlhYmxlIGNhdGVnb3LDrWEgeSBkaWFnbsOzc3RpY28gZXN0w6FuIGFsdGFtZW50ZSBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIGVuZMOzZ2VuYSwgcG9yIGxvIHF1ZSBlcyBuZWNlc2FyaW8gZWxpbWluYXJsYXMgZGVsIGFuw6FsaXNpcywgcGFyYSBubyBpbmN1cnJpciBlbiBwb3NpYmxlcyBzb2JyZWFqdXN0ZXMgZW4gbGEgZXRhcGEgZGUgbW9kZWxhZG8uDQoNCkNvbW8gc2UgaGFiw61hIG1lbmNpb25hZG8gYW50ZXJpb3JtZW50ZSwgdGVuaWVuZG8gZW4gY3VlbnRhIGVsIGFuw6FsaXNpcyBkZSBkYXRvcyBwZXJkaWRvcyBvIG51bG9zLCBzZSBkZWNpZGUgZGVzY2FydGFyIGxhIHZhcmlhYmxlIGluZ3Jlc28geWEgcXVlIGNvbnRpZW5lIG1hcyBkZSB1biAzMCUgZW4gZGF0b3MgcGVyZGlkb3MuDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KDQpkYXRhX3JlaG9zcCAlPiUNCiAgbXV0YXRlKGVzdHJhdG8gPSBpZmVsc2UoaXMubmEoZXN0cmF0bykgfCBlc3RyYXRvID09IC0xIHwgZXN0cmF0byA9PSAwLCAiU2luIEluZm9ybWFjaW9uIiwgZXN0cmF0byksDQogICAgICAgICBlc3RfY2l2aWwgPSBpZmVsc2UoaXMubmEoZXN0X2NpdmlsKSwgIlNpbiBJbmZvcm1hY2lvbiIsIGVzdF9jaXZpbCksDQogICAgICAgICBpbmdyZXNvID0gaWZlbHNlKGlzLm5hKGluZ3Jlc28pLCAiU2luIEluZm9ybWFjaW9uIiwgaW5ncmVzbyksDQogICAgICAgICBwcm92ZWVkb3IgPSBpZmVsc2UoaXMubmEocHJvdmVlZG9yKSwgIlNpbiBJbmZvcm1hY2lvbiIsIHByb3ZlZWRvciksDQogICAgICAgICBxdWlydXIgPSBpZmVsc2UocXVpcnVyID09IDEsICdTaScsICdObycpLA0KICAgICAgICAgZWRhZCA9IGNhc2Vfd2hlbiggZWRhZCA8PSAzMCB+ICIxOC0zMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBlZGFkID49IDMxICYgZWRhZCA8PSA0MCB+ICIzMS00MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBlZGFkID49IDQxICYgZWRhZCA8PSA1MCB+ICI0MS01MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBlZGFkID49IDUxICYgZWRhZCA8PSA2MCB+ICI1MS02MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBlZGFkID49IDYxICYgZWRhZCA8PSA3MCB+ICI2MS03MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBlZGFkID49IDcxICYgZWRhZCA8PSA4MCB+ICI3MS04MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBlZGFkID49IDgxIH4gIjgxKyIpLA0KICAgICAgICAgbWFyY2FzID0gY3V0KG1hcmNhcywgYnJlYWtzID0gKDA6MykqMiwgaW5jbHVkZS5sb3dlc3QgPSBUUlVFKSwNCiAgICAgICAgIGVzdF9jaXZpbCA9IGFzLmZhY3Rvcihlc3RfY2l2aWwpLA0KICAgICAgICAgZ2VuZXJvID0gYXMuZmFjdG9yKGdlbmVybyksDQogICAgICAgICBxdWlydXIgPSBhcy5mYWN0b3IocXVpcnVyKSwNCiAgICAgICAgIHJhbW8gPSBhcy5mYWN0b3IocmFtbyksDQogICAgICAgICBlZGFkID0gYXMuZmFjdG9yKGVkYWQpLA0KICAgICAgICAgZXN0cmF0byA9IGFzLmZhY3Rvcihlc3RyYXRvKSkgJT4lDQogIHNlbGVjdCgtZGlhZ25vcywgLWNhdGVnb3JpYSwgLWZlY2hhX2luZ3Jlc28sIC1pbmdyZXNvLCAtcHJvdmVlZG9yLCAtY2l1ZGFkKSAtPiBkYXRhX3JlaG9zcA0KDQpzdHIoZGF0YV9yZWhvc3ApDQpgYGANCg0KW1ZvbHZlciBhbCDDjW5kaWNlXSgjaW5kaWNlKTwvZGl2Pg0KDQo8aHI+DQo8aDIgaWQ9IkFuYWxpc2lzIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPkFuw6FsaXNpcyBFeHBsb3JhdG9yaW88L2gyPg0KDQo8aDMgaWQ9IkFuYWxpc2lzQ29uIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyJtYXJrZG93bj0iMSI+QW7DoWxpc2lzIHVuaXZhcmlhZG8gLSB2YXJpYWJsZXMgY29udGludWFzPC9oMz4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFcyBldmlkZW50ZSBsYSBleGlzdGVuY2lhIHRhbWJpw6luLCBkZSB2YWxvcmVzIGF0w61waWNvcyBtdXkgbWFyY2Fkb3MgdGFudG8gZW4gZWwgbnVtw6lybyBkZSBkw61hcyBkZSBob3NwaXRhbGl6YWNpw7NuLCBjb21vIGVuIGxvcyBuw7ptZXJvcyBkZSBkw61hcyBxdWUgZWwgcGFjaWVudGUgZXN0dXZvIGVuIGxhIFVuaWRhZCBkZSBDdWlkYWRvIEludGVuc2l2byB5IEVzcGVjaWFsLCBlbiBkw7NuZGUgbG9zIHZhbG9yZXMgYXTDrXBpY29zIG3DoXMgZ3JhbmRlcyBzdWNlZGVuIGVuIGxvcyBldmVudG9zIHF1ZSBubyBkZXNlbmNhZGVuYXJvbiBlbiByZWhvc3BpdGFsaXphY2nDs24uDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KDQpkYXRhX3JlaG9zcCAlPiUNCiAgZmlsdGVyKGRpYXNfdWNpID4gMCkgJT4lDQogIGdncGxvdCAoLiwgYWVzICggZGlhc191Y2ksIGNvbG9yID0gYXMuZmFjdG9yKHJlaG9zcF9vbXMpKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsPSJ3aGl0ZSIsIGFscGhhPTAuNSwgcG9zaXRpb249ImlkZW50aXR5IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHggPSAiRMOtYXMgVUNJIiwgDQogICAgICAgeSA9ICJGcmVjdWVuY2lhIFJlbGF0aXZhIiwgDQogICAgICAgZmlsbCA9ICIgIikgKw0KICBnZ3RpdGxlKCJEw61hcyBlbiBVbmlkYWQgZGUgQ3VpZGFkb3MiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIA0KICAgIHNjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgLT4gcDENCg0KZGF0YV9yZWhvc3AgJT4lDQogIGZpbHRlcihkaWFzX3VjZSA+IDApICU+JQ0KICBnZ3Bsb3QgKC4sIGFlcyAoIGRpYXNfdWNlLCBjb2xvciA9IGFzLmZhY3RvcihyZWhvc3Bfb21zKSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0id2hpdGUiLCBhbHBoYT0wLjUsIHBvc2l0aW9uPSJpZGVudGl0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh4ID0gIkTDrWFzIFVDRSIsIA0KICAgICAgIHkgPSAiRnJlY3VlbmNpYSBSZWxhdGl2YSIsIA0KICAgICAgIGZpbGwgPSAiUmVob3NwaXRhbGl6YWNpw7NuIikgKw0KICBnZ3RpdGxlKCJOw7ptZXJvIGRlIGTDrWFzIGVuIFVuaWRhZCBkZSBDdWlkYWRvcyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgDQogICAgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgLT4gcDINCg0KcDEgPC0gZ2dwbG90bHkocDEpDQpwMiA8LSBnZ3Bsb3RseShwMikNCg0Kc3VicGxvdChwMSwgcDIsIHRpdGxlWCA9IFRSVUUsIHRpdGxlWSA9IFRSVUUpICU+JQ0KICBsYXlvdXQoc2hvd2xlZ2VuZCA9IChGQUxTRSkpDQpgYGANCg0KQ29uIGVsIGFuw6FsaXNpcyBhbnRlcmlvciBubyBzw7NsbyBzZSBsb2dyYSBpZGVudGlmaWNhciBsYSBwcmVzZW5jaWEgZGUgdmFsb3JlcyBhdMOtcGljb3MsIHNpbm8gcXVlIHRhbWJpw6luIGVzIHBvc2libGUgZXZpZGVuY2lhciBxdWUgbG9zIGRhdG9zIHNlIGVuY3VlbnRyYW4gYWx0YW1lbnRlIGRlc2JhbGFuY2VhZG9zLiBFbiBlbCBjYXNvIGRlIGxvcyBvdXRsaWVycyBzZSB0cnVuY2Fyw6EgZW4gbG9zIGNhc29zIGVuIHF1ZSBzZWEgbmVjZXNhcmlvLCBpbXB1dGFuZG8gbG9zIHZhbG9yZXMgcXVlIHN1cGVyZW4gY2llcnRvIGzDrW1pdGUgZW4gZWwgcGVyY2VudGlsLCB0YW50byBtYXlvciBjb21vIG1lbm9yLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCmRhdGFfcmVob3NwICU+JQ0KICBtdXRhdGUocGFnb19ob3NwID0gaWZlbHNlKHF1aXJ1ciA9PSAiU2kiICYgcmVob3NwX29tcyA9PSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaWVyKG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgcXVpcnVyID09ICJTaSIgJiByZWhvc3Bfb21zID09IDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gInBhZ29faG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk3KSwgcGFnb19ob3NwKSwNCiAgICAgICAgIHBhZ29faG9zcCA9IGlmZWxzZShxdWlydXIgPT0gIlNpIiAmIHJlaG9zcF9vbXMgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHF1aXJ1ciA9PSAiU2kiICYgcmVob3NwX29tcyA9PSAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gInBhZ29faG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk4KSwgcGFnb19ob3NwKSwNCiAgICAgICAgIHBhZ29faG9zcCA9IGlmZWxzZShxdWlydXIgPT0gIk5vIiAmIHJlaG9zcF9vbXMgPT0gMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHF1aXJ1ciA9PSAiTm8iICYgcmVob3NwX29tcyA9PSAwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJwYWdvX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45NyksIHBhZ29faG9zcCksIA0KICAgICAgICAgcGFnb19ob3NwID0gaWZlbHNlKHF1aXJ1ciA9PSAiTm8iICYgcmVob3NwX29tcyA9PSAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaWVyKG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgcXVpcnVyID09ICJObyIgJiByZWhvc3Bfb21zID09IDEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gInBhZ29faG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk4KSwgcGFnb19ob3NwKSwNCiAgICAgICAgIGRpYXNfaG9zcCA9IGlmZWxzZShyZWhvc3Bfb21zID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpZXIobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCByZWhvc3Bfb21zID09IDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICJkaWFzX2hvc3AiLCBxX21pbiA9IDAsIHFfbWF4ID0gMC45OSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHJlaG9zcF9vbXMgPT0gMSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImRpYXNfaG9zcCIsIHFfbWluID0gMCwgcV9tYXggPSAwLjk5KSksDQogICAgICAgICBkaWFzX3VjaSA9IGlmZWxzZShyZWhvc3Bfb21zID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHJlaG9zcF9vbXMgPT0gMCAmIGRpYXNfdWNpID4gMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImRpYXNfdWNpIiwgcV9taW4gPSAwLCBxX21heCA9IDAuOTk5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkaWFzX3VjaSksDQogICAgICAgICBkaWFzX3VjZSA9IGlmZWxzZShyZWhvc3Bfb21zID09IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGllcihteWRhdGEgPSBmaWx0ZXIoZGF0YV9yZWhvc3AsIHJlaG9zcF9vbXMgPT0gMCAmIGRpYXNfdWNlID4gMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gImRpYXNfdWNlIiwgcV9taW4gPSAwLCBxX21heCA9IDAuOTk5KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkaWFzX3VjaSkpIC0+IGRhdGFfcmVob3NwDQpgYGANCg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCg0KcDMgPC0gbXlib3hwbG90KG15ZGF0YSA9IGZpbHRlcihkYXRhX3JlaG9zcCwgcGFnb19ob3NwID4gMCksIA0KICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgIG15b3V0Y29tZSA9ICJwYWdvX2hvc3AiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gIlBhZ28gaG9zcGl0YWxpemFjacOzbiIsIA0KICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiUGFnbyBEaWFnIiwgDQogICAgICAgICAgICAgICAgbXlfZmlsbCA9ICIiKQ0KDQpwNCA8LSBteWJveHBsb3QobXlkYXRhID0gZGF0YV9yZWhvc3AsIA0KICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgIG15b3V0Y29tZSA9ICJkaWFzX2hvc3AiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gIlRvdGFsIGRpYXMgaG9zcGl0YWxpemFkbyIsIA0KICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRGlhcyBob3NwaXRhbGl6YWNpw7NuIiwgDQogICAgICAgICAgICAgICAgbXlfZmlsbCA9ICIiKQ0KDQpwNSA8LSBteWJveHBsb3QobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCBkaWFzX3VjaSA+IDApLCANCiAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAiZGlhc191Y2kiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gICJUb3RhbCBkw61hcyBVQ0kiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkRpYXMgVUNJIiwgDQogICAgICAgICAgICAgICAgbXlfZmlsbCA9ICIiKQ0KDQpwNiA8LSBteWJveHBsb3QobXlkYXRhID0gZmlsdGVyKGRhdGFfcmVob3NwLCBkaWFzX3VjZSA+IDApLCANCiAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAiZGlhc191Y2UiLCANCiAgICAgICAgICAgICAgICBteXRpdGxlID0gIlRvdGFsIGTDrWFzIFVDRSIsIA0KICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRGlhcyBVQ0UiLCANCiAgICAgICAgICAgICAgICBteV9maWxsID0gIiIpDQoNCnAzIDwtIGdncGxvdGx5KHAzKQ0KcDQgPC0gZ2dwbG90bHkocDQpDQpwNSA8LSBnZ3Bsb3RseShwNSkNCnA2IDwtIGdncGxvdGx5KHA2KQ0KDQpzdWJwbG90KHA1LCBwNiwgcDMsIHA0LCANCiAgICAgICAgbnJvd3MgPSAyLCBuY29sKDIpLCANCiAgICAgICAgdGl0bGVYID0gVFJVRSwgdGl0bGVZID0gVFJVRSkgJT4lDQogIGxheW91dChzaG93bGVnZW5kID0gKEZBTFNFKSkNCg0KDQoNCmBgYA0KDQpTZSBwdWVkZSBvYnNlcnZhciBxdWUgZW4gbGEgdmFyaWFibGUgZMOtYXMgVUNJLCBjb3JyZXNwb25kaWVudGUgYWwgcHJpbWVyIGRpYWduw7NzdGljbywgbm8gcGFyZWNlIGhhYmVyIHVuYSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGEgZGlzdHJpYnVjacOzbiBhbCBkaXNjcmltaW5hciBwb3IgbGEgdmFyaWFibGUgb2JqZXRpdm8gYmluYXJpYSwgZXMgZGVjaXIsIGVudHJlIGxvcyBjYXNvcyBkZSByZWhvc3BpdGFsaXphY2nDs24gKDEpIHkgY2Fzb3MgZGUgbm8gcmVob3NwaXRhbGl6YWNpw7NuICgwKS4gQWRpY2lvbmFsbWVudGUsIGxhIGRpc3RpYnVjacOzbiBlbiBhbWJhcyB2YXJpYWJsZXMgbm8gZXMgc2ltw6l0cmljYS4gDQoNCkEgcGVzYXIgZGUgcXVlIGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGJhc3RhbnRlIGRpc3BlcnNvcywgc2UgbG9ncmEgaWRlbnRpZmljYXIgZGlmZXJlbmNpYXMgZW4gbGEgdmFyaWFibGUgZGVsIHBhZ28gLWNvbiB2YWxvcmVzIG3DoXMgYWx0b3MgZW4gbG9zIGNhc28gZW4gcXVlIG5vIHRlcm1pbsOzIGRlIGJ1ZXZvIGhvc3BpdGFsaXphZG8sIHkgZW4gZWwgY2Fzw7MgZGVsIG7Dum1lcm8gZGUgZMOtYXMgaG9zcGl0YWxpemFkbyBsb3MgcmFuZ29zIHNvbiBtdWNobyBtw6FzIHBlcXVlw7FvcyBjdWFuZG8gaGF5IHVuYSByZWhvc3BpdGFsaXphY2nDs24uDQoNCjxocj4NCjxoMyBpZD0iQW5hbGlzaXNDYXIic3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiIG1hcmtkb3duID0gIjEiPkFuw6FsaXNpcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzPC9oMz4NCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpPYnNlcnZhbmRvIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGxhIGRpZmVyZW5jaWEgZW50cmUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBlbCBldmVudG8gb2N1cnJhIChoYXlhIHJlaG9zcGl0YWxpemFjacOzbikgbyBubywgc2UgcHVlZGUgZXZpZGVuY2lhciBzw7NsbyBlbiBhbGd1bmFzIGNsYXNlcyBwb3IgY2F0ZWdvcsOtYSwgcGVybyBlbiBnZW5lcmFsLCBsYXMgcHJvcG9yY2lvbmVzIHN1ZWxlbiBzZXIgYmFzdGFudGVzIHNpbWlsYXJlcywgcG9yIGxvIHF1ZSBubyBlcyBwb3NpYmxlIGVsYWJvcmFyIGEgcHJpb3JpIHVuYSBoaXDDs3Rlc2lzIHF1ZSBlc3RpcHVsZSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsYXMgZGlzdHJpYnVjaW9uZXMsIHBvciBsbyBtZW5vcyBwYXJhIG5pbmd1bmEgZGUgbGFzIGRvcyB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIGVuIGVsIGdyw6FmaWNvIGEgY29udGludWFjacOzbi4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCnA3IDwtIG15Z2VvbV9iYXIobXlkYXRhID0gZGF0YV9yZWhvc3AsIA0KICAgICAgICAgICAgICAgICBteWV4cG9zdXJlID0gImVkYWQiLCANCiAgICAgICAgICAgICAgICAgbXlvdXRjb21lID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJFZGFkIiwgDQogICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkZyZWN1ZW5jaWEiLCANCiAgICAgICAgICAgICAgICAgbXlfZmlsbCA9ICJSZWhvc3BpdGFsaXphY2nDs24iLCANCiAgICAgICAgICAgICAgICAgbXlfYW5nbGUgPSBOVUxMLA0KICAgICAgICAgICAgICAgICBteV9sZWdlbmQgPSAicmlnaHQiKQ0KDQpwOCA8LSBteWdlb21fYmFyKG15ZGF0YSA9IGRhdGFfcmVob3NwLCANCiAgICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAiZXN0cmF0byIsIA0KICAgICAgICAgICAgICAgICAgbXlvdXRjb21lID0gInJlaG9zcF9vbXMiLCANCiAgICAgICAgICAgICAgICAgIG15dGl0bGUgPSAiRXN0cmF0byIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF94ID0gIiIsIA0KICAgICAgICAgICAgICAgICAgbXlsYWJlbF95ID0gIkZyZWN1ZW5jaWEiLCANCiAgICAgICAgICAgICAgICAgIG15X2ZpbGwgPSAiUmVob3NwaXRhbGl6YWNpw7NuIiwgDQogICAgICAgICAgICAgICAgICBteV9hbmdsZSA9IE5VTEwsDQogICAgICAgICAgICAgICAgICBteV9sZWdlbmQgPSAibm9uZSIpDQoNCmdyaWQuYXJyYW5nZShwNywNCiAgICAgICAgICAgICBwOCkNCg0KYGBgDQoNClBvciBvdHJvIGxhZG8sIGVsIGF0cmlidXRvIHF1ZSBpbmRpY2EgZWwgaGVjaG8gZGUgcXVlIHNlIGhheWFuIHJlYWxpemFkbyBwcm9jZWRpbWllbnRvcyBxdWlyw7pyZ2ljb3MgZHVyYW50ZSBsYSBwcmltZXJhIGhvc3BpdGFsaXphY2nDs24gbXVlc3RyYW4gY2llcnRhIGRpZmVyZW5jaWEgZW4gbGEgZGlzdHJpYnVpw7NuIHBvciBncnVwbzsgZXMgbcOhcyBwcm9iYWJsZSBxdWUgbGEgcGVyc29uYSBkZWJhIHNlciByZWhvc3BpdGFsaXphZGEgZGUgbnVldm8uDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KDQpwOSA8LSBteWdlb21fYmFyKG15ZGF0YSA9IGRhdGFfcmVob3NwLCANCiAgICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAicXVpcnVyIiwgDQogICAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJQcm9jIHF1aXLDunJnaWNvIiwgDQogICAgICAgICAgICAgICAgICBteWxhYmVsX3ggPSAiIiwgDQogICAgICAgICAgICAgICAgICBteWxhYmVsX3kgPSAiRnJlY3VlbmNpYSIsIA0KICAgICAgICAgICAgICAgICAgbXlfZmlsbCA9ICJSZWhvc3BpdGFsaXphY2nDs24iLCANCiAgICAgICAgICAgICAgICAgIG15X2FuZ2xlID0gTlVMTCwNCiAgICAgICAgICAgICAgICAgIG15X2xlZ2VuZCA9ICJyaWdodCIpDQoNCnAxMCA8LSBteWdlb21fYmFyKG15ZGF0YSA9IGRhdGFfcmVob3NwLCANCiAgICAgICAgICAgICAgICAgIG15ZXhwb3N1cmUgPSAiZXN0X2NpdmlsIiwgDQogICAgICAgICAgICAgICAgICBteW91dGNvbWUgPSAicmVob3NwX29tcyIsIA0KICAgICAgICAgICAgICAgICAgbXl0aXRsZSA9ICJFc3RhZG8gY2l2aWwiLCANCiAgICAgICAgICAgICAgICAgIG15bGFiZWxfeCA9ICIiLCANCiAgICAgICAgICAgICAgICAgIG15bGFiZWxfeSA9ICJGcmVjdWVuY2lhIiwgDQogICAgICAgICAgICAgICAgICBteV9maWxsID0gIlJlaG9zcGl0YWxpemFjacOzbiIsIA0KICAgICAgICAgICAgICAgICAgbXlfYW5nbGUgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgbXlfbGVnZW5kID0gInJpZ2h0IikNCg0KZ3JpZC5hcnJhbmdlKHA5LA0KICAgICAgICAgICAgICBwMTAsDQogICAgICAgICAgICAgIG5jb2wgPSAxLA0KICAgICAgICAgICAgICBucm93ID0gMikNCg0KYGBgDQoNCkNvbiBlbCBvYmpldGl2byBkZSBlbnJpcXVlY2VyIGVsIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8sIHNlIGNhbGN1bGFyw6FuIGRvcyBtZWRpZGFzIG11eSBjb23Dum5lcyBkZSBsYSB0ZW9yw61hIGRlIGxhIGluZm9ybWFjacOzbiwgw6lzdGFzIHBlcm1pdGVuIGluZmVyaXIgYWxnbyBkZWwgcG9kZXIgcHJlZGljdGl2byBxdWUgcHVlZGVuIHRlbmVyIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMsIGFudGVzIGRlIGhhY2VyIHBhcnRlIGRlIHVuIG1vZGVsby4NCg0KW1ZvbHZlciBhbCDDjW5kaWNlXSgjaW5kaWNlKTwvZGl2Pg0KDQo8aHI+DQo8aDIgaWQ9IkFuYWxpc2lzV09FIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd24gPSIxIj5BbsOhbGlzaXMgZGUgY2xhc2lmaWNhY2nDs24gYmluYXJpYSB1c2FuZG8gV09FIHkgZWwgSVY8L2gyPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIHBlc28gZGUgbGEgZXZpZGVuY2lhIChXT0UpIHkgZWwgdmFsb3IgZGUgbGEgaW5mb3JtYWNpw7NuIChJVikgYXl1ZGFuLCBlbnRyZSBvdHJhcyBjb3NhcywgYSBkZXRlcm1pbmFyIGxhIGNvbnRyaWJ1Y2nDs24gaW5kZXBlbmRpZW50ZSBkZSBjYWRhIHZhcmlhYmxlIGFsIHJlc3VsdGFkbywgeSBkZXRlY3RhciByZWxhY2lvbmVzIGxpbmVhbGVzIHkgbm8gbGluZWFsZXMuIEVsIFdPRSBtaWRlIGxhIHJlbGFjacOzbiBlbnRyZSBsYSB2YXJpYWJsZSBwcmVkaWN0aXZhIHkgZWwgb2JqZXRvIGJpbmFyaW8sIG1pZW50cmFzIHF1ZSBlbCBJViBtaWRlIGxhIGZ1ZXJ6YSBwcmVkaWN0aXZhIGRlIGVzYSByZWxhY2nDs24uDQoNCkxhIHRhYmxhIGEgY29udGludWFjacOzbiBjb250aWVuZSBsb3MgdmFsb3JlcyBkZWwgInZhbG9yIGRlIGxhIGluZm9ybWFjacOzbiIgY29uIHkgc2luIGVsIGFqdXN0ZSBkZXJpdmFkbyBkZSBsYSB2YWxpZGFjacOzbiBjcnV6YWRhLiBDdWFuZG8gc2UgcmVhbGl6YSBlbCBhanVzdGUgY29uIGVsIG9iamV0aXZvIGRlIHF1ZSBsb3MgcmVzdWx0YWRvcyBzZWFuIG3DoXMgZXN0YWJsZXMsIHRhbnRvIHBhZ28gZGVsIGRpYWduw7NzdGljbywgZWwgaGVjaG8gZGUgcXVlIGVsIHBhY2llbnRlIGhhbGxhIHBhc2FkbyBwb3IgbGEgVW5pZGFkIGRlIGN1aWRhZG9zLCB5IHNpIGZ1ZXJvbiByZWFsaXphZG9zIHByb2NlZGltaWVudG9zIHF1aXLDunJnaWNvcyBzZXLDoW4gbGFzIMO6bmljYXMgdmFyaWFibGVzIGNvbiBzdWZpY2llbnRlIGNhcGFjaWRhZCBkZSBwcmVkaWNjacOzbiBhIG5pdmVsIGluZGl2aWR1YWwgeSB1bml2YXJpYWJsZSAoSXYgPiAwLjA1KS4gQ3VhbmRvIHNlIHJlbGFqYSBlbCBzdXB1ZXN0bywgSVYgc2luIHJlc3RhciBlbCBwZW5hbHR5LCBzZSBpbmNsdWlyw61hbiBsb3MgZMOtYXMgZW4gcXVlIGVzdHV2byBob3NwaXRhbGl6YWRvLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnNldC5zZWVkKDEyMzQpDQpkYXRhX3JlaG9zcCA8LSBkYXRhX3JlaG9zcCAlPiUNCiAgbXV0YXRlKGlkID0gMTpucm93KC4pKSANCg0KZGF0YV9yZWhvc3AgJT4lDQogIHNhbXBsZV9mcmFjKHNpemUgPSAuNzApIC0+IHRyYWluDQoNCmRhdGFfcmVob3NwICU+JQ0KICBhbnRpX2pvaW4oeCA9IC4sDQogICAgICAgICAgICB5ID0gdHJhaW4sIA0KICAgICAgICAgICAgYnkgPSAiaWQiKSAtPiB0ZXN0DQogIA0KdHJhaW4gPC0gc2VsZWN0KC5kYXRhID0gdHJhaW4sIC1pZCkNCnRlc3QgPC0gc2VsZWN0KC5kYXRhID0gdGVzdCwgLWlkKQ0KDQpJViA8LSBjcmVhdGVfaW5mb3RhYmxlcyhkYXRhID0gdHJhaW4sDQogICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0ZXN0LA0KICAgICAgICAgICAgICAgICAgIHkgPSAicmVob3NwX29tcyIpDQoNCmthYmxlX3N0eWxpbmcoa2FibGUoSVYkU3VtbWFyeSksIA0KICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgcm93X2xhYmVsX3Bvc2l0aW9uID0gMSwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQpgYGANCg0KRGUgYWN1ZXJkbyBhbCBwb2RlciBwcmVkaWN0aXZvIGRlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMsIHNlIGVsaWdlbiBhcXVlbGxhcyBjdXlvIFZhbG9yIGRlIGxhIGluZm9ybWFjacOTbiAoSVYpIHNlYSBzdXBlcmlvciBhbCAyJSAoMCwwMikuIExhcyB2YXJpYWJsZXMgY29uIElWIGluZmVyaW9yZXMgYSBlc3RlIHZhbG9yIHNlIGNvbnNpZGVyYW4gaW1wcmVkaWN0aXZhcyB5IHNlIGRlY2lkZSBkZXNjYXJ0YXJsYXMuIExhcyB2YXJpYWJsZXMgcXVlIGNvbnRpbnVhbiwgZW4gb3JkZW4gZGUgcmVsZXZhbmNpYSBzZWd1biBzdSBwb2RlciBwcmVkaWN0b3IsIHNvbjoNCg0KPHVsPg0KPGxpPnBhZ29faG9zcDwvbGk+DQo8bGk+cXVpcnVyPC9saT4NCjxsaT5kaWFzX3VjZTwvbGk+DQo8bGk+ZGlhc191Y2k8L2xpPg0KPGxpPnByb3ZlZWRvcjwvbGk+DQo8bGk+ZGlhc19ob3NwPC9saT4NCjxsaT5lZGFkPC9saT4NCjxsaT5nZW5lcm88L2xpPg0KPGxpPmNpdWRhZDwvbGk+DQo8L3VsPg0KDQoNClNpbiBlbWJhcmdvLCB0YW50byBsYSBjaXVkYWQgY29tbyBlbCBwcm92ZWVkb3Igbm8gc2Vyw6FuIHRlbmlkb3MgZW4gY3VlbnRhLCBwb3IgcXVlIHB1ZWRlbiBsbGVnYXIgYSBjb25kaWNpb25hciBudWVzdHJhIHZhcmlhYmxlIG9iamV0aXZvLg0KDQpFbmZvY2FuZG9ub3MgZW4gZWwgcGFnbyBkZWwgZGlhZ27Ds3N0aWNvLCBlbCBjdWFsLCBlcyB1bmEgZGUgbGFzIHZhcmlhYmxlcyBjb24gbWF5b3IgaW5mbHVlbmNpYSwgZWwgV09FIG5vcyBpbmRpY2EgdW5hIHJlbGFjacOzbiBubyBsaW5lYWwsIGNvbiB1biBpbmNyZW1lbnRvIGVuIGVsIFdPRSBhIG1lZGlkYSBxdWUgZGlzbWludXllIGVsIHJhbmdvIGRlIHBhZ28gZW4gZWwgZGlhZ27Ds3N0aWNvLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCmthYmxlX3N0eWxpbmcoa2FibGUoSVYkVGFibGVzJGVkYWQpLCANCiAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgIHJvd19sYWJlbF9wb3NpdGlvbiA9IDEsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KbiA8LSBuYW1lcyhJViRUYWJsZXMpDQpmb3IgKGkgaW4gMTpsZW5ndGgobikpew0KICAgcGxvdF9pbmZvdGFibGVzKElWLCBuW2ldKX0NCg0KTXVsdGlQbG90KElWLCBJViRTdW1tYXJ5JFZhcmlhYmxlW2MoMSwyLDMsNCw2LDEwKV0pDQpgYGANCg0KQ29tbyBzZSBwdWRvIG9ic2VydmFyIGVuIGVsIGFuYWxpc2lzIGRlbCBXT0UsIGVzdGEgdMOpY25pY2EgYWp1c3RhIGxvcyB2YWxvcmVzIGRlIGxhcyB2YXJpYWJsZXMgbnVtZXJpY2FzIGVuIHJhbmdvcyBhY290YWRvcyBkZSBhY3VlcmRvIGFsIHZhbG9yIGRlIGxhIGluZm9ybWFjaW9uIGRlIGNhZGEgdW5hIGRlIGVsbGFzIGVuIHJlbGFjaW9uIGNvbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZS4gUG9yIGVzdG8sIGVzIGltcG9ydGFudGUgdHJhbnNmb3JtYXIgZGljaGFzIHZhcmlhYmxlcyBlbiBsb3MgcmFuZ29zIHJlY29tZW5kYWRvcy4NCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQojIGRhdGFfcmVob3NwICU+JQ0KIyAgIG11dGF0ZShwYWdvX2hvc3AxID0gY2FzZV93aGVuKCBwYWdvX2hvc3AgPD0gMTA3NDEwIH4gIlswLDEwNzQxMF0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdvX2hvc3AgPj0gMTA3NTcwICYgcGFnb19ob3NwIDw9IDc3Njk2NSB+ICJbMTA3NTcwLDc3Njk2NV0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdvX2hvc3AgPj0gNzc3Njk3ICYgcGFnb19ob3NwIDw9IDE1NDc4MDYgfiAiWzc3NzY5NywxNTQ3ODA2XSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ29faG9zcCA+PSAxNTQ3ODQ3ICYgcGFnb19ob3NwIDw9IDIyNTE3NjQgfiAiWzE1NDc4NDcsMjI1MTc2NF0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdvX2hvc3AgPj0gMjI1MTkxMyAmIHBhZ29faG9zcCA8PSAzMDIxODYyIH4gIlsyMjUxOTEzLDMwMjE4NjJdIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnb19ob3NwID49IDMwMjIwMzAgJiBwYWdvX2hvc3AgPD0gMzk5NjkyOCB+ICJbMzAyMjAzMCwzOTk2OTI4XSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ29faG9zcCA+PSAzOTk2OTMzICYgcGFnb19ob3NwIDw9IDUzMjg0MjMgfiAiWzM5OTY5MzMsNTMyODQyM10iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdvX2hvc3AgPj0gNTMyOTUwMCAmIHBhZ29faG9zcCA8PSA3MDQ4MjkwIH4gIls1MzI5NTAwLDcwNDgyOTBdIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnb19ob3NwID49IDcwNDg5MDIgJiBwYWdvX2hvc3AgPD0gMTE0MDg0MTUgfiAiWzcwNDg5MDIsMTE0MDg0MTVdIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnb19ob3NwID49IDExNDA4NjI1ICYgcGFnb19ob3NwIDw9IDQ3Mzg3ODgzIH4gIlsxMTQwODYyNSw0NzM4Nzg4M10iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdvX2hvc3AgPj0gNDczODc4ODMgfiAiWzQ3Mzg3ODgzKyIpLA0KIyAgICAgICAgICBkaWFzX2hvc3AxID0gY2FzZV93aGVuKCBkaWFzX2hvc3AgPSAxIH4gIlsxXSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhc19ob3NwID0gMiB+ICJbMl0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYXNfaG9zcCA9IDMgfiAiWzNdIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFzX2hvc3AgPSA0IH4gIls0XSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhc19ob3NwID49IDUgJiBkaWFzX2hvc3AgPD0gNyB+ICJbNSw3XSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhc19ob3NwID49IDggJiBkaWFzX2hvc3AgPD0gMzAgfiAiWzgsMzBdIikpIC0+IGRhdGFfcmVob3NwMg0KIyANCiMgDQojIHN0cihkYXRhX3JlaG9zcCkNCg0KYGBgDQoNCg0KW1ZvbHZlciBhbCDDjW5kaWNlXSgjaW5kaWNlKTwvZGl2Pg0KDQo8aHI+DQo8aDIgaWQ9Ik1vZGVsbyIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiIG1hcmtkb3duPSIxIj5Nb2RlbG88L2E+PC9oMj4NCjxkaXYgc3R5bGUgPSAidGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVsIG9iamV0aXZvIHByaW5jaXBhbCBkZWwgYW7DoWxpc2lzIGVzIGVzdGltYXIgdW4gbW9kZWxvIHByZWRpY3Rpdm8gY29uIGVsIGN1w6FsIHNlIHB1ZWRhIGVzdGltYXIgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biBwYWNpZW50ZSB0ZXJtaW5lIGVuIHVuYSByZWhvc3BpdGFsaXphY2nDs24sIGFzb2NpYWRhIGEgdW4gZGlhbmfDs3N0aWNvIGFudGVyaW9yLiBQYXJhIGVsbG8gc2UgZW1wbGVhcsOhIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EsIGVsIGN1w6FsIGVzIGFtcGxpYW1lbnRlIHV0aWxpemFkbyBwYXJhIHJlc29sdmVyIHByb2JsZW1hcyBkZSBjbGFzaWZpY2FjacOzbiBiaW5hcmlhLg0KDQpVbmEgdmV6IHNlIHJlYWxpemFuIGxvcyBmaWx0cm9zIGRlIGNhbGlkYWQgeSBjb21wbGV0aXR1ZCwgeSB0cmFzIGxvIG9idGVuaWRvIGVuIGxvcyByZXN1bHRhZG9zIGRlbCBXT0UsIHNlIHByb2NlZGUgYSByZWFsaXphciBsYSBzZWxlY2Npb24gZGUgdmFyaWFibGVzIHBhcmEgZWwgbW9kZWxvLiBTZSB0ZW5kcsOhbiBlbiBjdWVudGEgZW50b25jZXMsIGVsIHBhZ28gcmVhbGl6YWRvLCBsb3MgZMOtYXMgZW4gcXVlIGVzdHV2byBlbCBwYWNpZW50ZSBkZSBmb3JtYSBnZW5lcmFsLCBsb3MgZMOtYXMgcXVlIHBlcm1hbmVjacOzIGVuIGxhIFVuaWRhZCBkZSBDdWlkYWRvcyAtaW50ZW5zaXZvcyBvIGVzcGVjaWFsZXMsIGVsIGhlY2hvIGRlIHF1ZSBzZSBsZSBoYXlhIHJlYWxpemFkbyBvIG5vIHVuYSBjaXJ1Z8OtYSwgZWwgZ8OpbmVybyB5IGxhIGVkYWQuDQoNClBhcmEgZXZhbHVhciBsYSBjYXBhY2lkYWQgZGUgZ2VuZXJhbGl6YWNpw7NuIGRlbCBtb2RlbG8sIHNlIGRpdmlkaXLDoSBlbCBjb25qdW50byBkZSBkYXRvcyBlbiBlbnRyZW5hbWllbnRvICg3MCUpIHkgcHJ1ZWJhICgzMCUpLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnNldC5zZWVkKDEyMzQpDQpkYXRhX3JlaG9zcCAlPiUNCiAgc2VsZWN0KGlkLA0KICAgICAgICBwYWdvX2hvc3AsDQogICAgICAgIHF1aXJ1ciwNCiAgICAgICAgZGlhc191Y2UsDQogICAgICAgIGRpYXNfdWNpLA0KICAgICAgICBkaWFzX2hvc3AsDQogICAgICAgIGdlbmVybywNCiAgICAgICAgZWRhZCwNCiAgICAgICAgcmVob3NwX29tcykgLT4gbW9kZWxfcmVob3NwDQoNCm1vZGVsX3JlaG9zcCAlPiUNCiAgc2FtcGxlX2ZyYWMoc2l6ZSA9IDAuNykgLT4gdHJhaW5pbmcNCg0KZGF0YV9yZWhvc3AgJT4lDQogIGFudGlfam9pbih4ID0gLiwNCiAgICAgICAgICAgIHkgPSB0cmFpbmluZywNCiAgICAgICAgICAgIGJ5ID0gImlkIikgLT4gdGVzdGluZw0KDQp0ZXN0aW5nICU+JQ0KICBzZWxlY3QoLWlkKSAtPiB0ZXN0aW5nDQoNCnRyYWluaW5nICU+JQ0KICBzZWxlY3QoLWlkKSAlPiUNCiAgbXV0YXRlKHJlaG9zcF9vbXMgPSBhcy5mYWN0b3IocmVob3NwX29tcykpIC0+IHRyYWluaW5nDQoNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMyBpZD0iU01PVEUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IiBtYXJrZG93bj0iMSI+U21vdGU8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkNvbW8gc2UgaGFiaWEgbWVuY2lvbmFkbyBhbnRlcmlvcm1lbnRlLCBsYSBpbmZvcm1hY2lvbiBzZSBlbmN1ZW50cmEgZGVzYmFsYW5jZWFkYTsgZXN0byBlcywgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBlbCBwcm9ibGVtYSBlbiBxdWUgc2UgZXN0YSB0cmFiYWphbmRvIGNvbnNpc3RlIGVuIGxhIGNsYXNpZmljYWNpb24gZGUgdW5hIHZhcmlhYmxlIGRpY290w7NtaWNhLCBzZSBkZWJlIGFuYWxpemFyIGVsIG5pdmVsIGRlIHJlcHJlc2VudGFjaW9uIGRlIHN1cyBwb3NpYmxlcyB2YWxvcmVzIGRlbnRybyBkZWwgY29uanVudG8gdG90YWwgZGUgZGF0b3MuDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KDQprYWJsZShhcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUobW9kZWxfcmVob3NwJHJlaG9zcF9vbXMpKSkpICU+JQ0Ka2FibGVfc3R5bGluZyhwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgcm93X2xhYmVsX3Bvc2l0aW9uID0gMSwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpICU+JQ0Kcm93X3NwZWMoMCxiYWNrZ3JvdW5kPSIjRUJGMEY3IikNCg0KDQpgYGANCg0KVmVtb3MgcXVlIGxhIHJlcHJlc2VudGFjaW9uIHBhcmEgbGEgY2F0ZWdvcsOtYSBwb3NpdGl2YSBlcyB1biBwb2NvIG1hcyBkZWwgMiUgZGUgbGEgaW5mb3JtYWNpw7NuLiBFbiBlc3RlIGNhc28gdmFtb3MgYSByZWFsaXphciB1biB0cmF0YW1pZW50byBxdWUgcGVybWl0YSBhdW1lbnRhciBsYSBjbGFzZSBtaW5vcml0YXJpYSwgc2luIHV0aWxpemFyIHNvbHVjaW9uZXMgZ2Vuw6lyaWNhcyBjb21vIHJlZHVjaXIgbGEgY2xhc2UgbWF5b3JpdGFyaWEgYWwgbml2ZWwgZGUgbGEgY2xhc2UgbWVub3IuDQoNClBhcmEgZWxsbywgdmFtb3MgYSB1dGlsaXphciBsYSB0w6ljbmljYSBTTU9URSAoU3ludGhldGljIE1pbm9yaXR5IE92ZXJzYW1wbGluZyBNZXRob2QpLCBsYSBjdWFsIGdlbmVyYSBudWV2YXMgaW5zdGFuY2lhcyBhcnRpZmljaWFsZXMgZGUgbGEgY2xhc2UgbcOhcyBwZXF1ZcOxYSBpbnRlcnBvbGFuZG8gbG9zIHZhbG9yZXMgZGUgbGFzIGluc3RhbmNpYXMgbWlub3JpdGFyaWFzIG3DoXMgY2VyY2FuYXMgYSB1bmEgZGFkYS4NCg0KUG9yIG1lZGlvIGRlIFNNT1RFIHNlIGdlbmVyYXLDoSB1biBudWV2byBzZXQgZGUgZGF0b3MgZGUgZW50cmVuYW1pZW50bywgZW4gZWwgY3VhbCBzZSB0ZW5nYSB1biA2MCUgZGUgaW5mb3JtYWNpb24gcGFyYSBsYSBjYXRlZ29yaWEgbmVnYXRpdmEgKHJlaG9zcF9vbXMgPSAwKSB5IDQwJSBwYXJhIGxhIGNhdGVnb3JpYSBwb3NpdGl2YSAocmVob3NwX29tcyA9IDApLg0KDQpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnRyYWluaW5nIDwtIFNNT1RFKHJlaG9zcF9vbXMgfiAuLCBhcy5kYXRhLmZyYW1lKHRyYWluaW5nKSwgcGVyYy5vdmVyID0gMzAwLCBwZXJjLnVuZGVyID0gMjAwKQ0KYGBgDQoNClZlcmlmaWNhbW9zIHF1ZSBlbCBzZXQgZGUgZW50cmVuYW1pZW50byBzZSBlbmN1ZW50cmUgYmFsYW5jZWFkbzoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGV2YWwgPVRSVUV9DQoNCmthYmxlX3N0eWxpbmcoa2FibGUoYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKHRyYWluaW5nJHJlaG9zcF9vbXMpKSkpLCANCiAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgIHJvd19sYWJlbF9wb3NpdGlvbiA9IDEsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKSAlPiUNCnJvd19zcGVjKDAsYmFja2dyb3VuZD0iI0VCRjBGNyIpDQoNCmBgYA0KDQpbVm9sdmVyIGFsIMONbmRpY2VdKCNpbmRpY2UpPC9kaXY+DQoNCjxocj4NCjxoMyBpZD0iYWp1c3RlbW9kIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgbWFya2Rvd249IjEiPkFqdXN0ZSBkZWwgbW9kZWxvIHkgRXN0aW1hY2nDs24gZGUgcGFyw6FtZXRyb3M8L2gzPg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkRlbCByZXN1bHRhZG8gZXhwbG9yYXRvcmlvIGFudGVyaW9yLCBhbCBkaXNjcmltaW5hciBlbCBhbsOhbGlzaXMgZGUgbGFzIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBwb3IgbnVlc3RyYSB2YXJpYWJsZSBvYmpldGl2byAoUmVob3NwaXRhbGl6YWNpw7NuKSwgZXMgcG9zaWJsZSBldmlkZW5jaWFyIHVuYSBkaWZlcmVuY2lhIGNsYXJhIGVudHJlIGxhcyBkaXN0cmlidWNpb25lcyBwYXJhIGxvcyBhdHJpYnV0b3M6IFBhZ28vY29zdG8gZGVsIHByb2NlZGltaWVudG8geSBsb3MgZMOtYXMgZW4gcXVlIGVsIHVzdWFyaW8gZXN0dXZvIGludGVybmFkbyB5YSBzZWEgZW4gbGEgVW5pZGFkIGRlIEN1aWRhZG9zIEludGVuc2l2b3MgbyBFc3BlY2lhbGVzLiBFc3RvIHBvZHLDrWEgc2VyIHVuIGluZGljaW8gZGUgcXVlIGVzdGFzIHZhcmlhYmxlcyBlbiBwYXJ0aWN1bGFyLCBwdWVkZW4gbGxlZ2FyIGEgc2VyIHJlbGV2YW50ZXMgcGFyYSBleHBsaWNhciBsYSBwcm9iYWJpbGlkYWQgZGUgb2N1cnJlbmNpYSBkZWwgZXZlbnRvLCBlcyBkZWNpciwgY3VhbmRvIGh1Ym8gdW5hIGhvc3BpdGFsaXphY2nDs24gcG9zdGVyaW9yIGxpZ2FkYSBhIHVuIGRpYWduw7NzdGljby4NCg0KQSBjb250aW51YWNpw7NuLCBhbCBhanVzdGFyIGVsIG1vZGVsbyBvYnRlbmVtb3MgbG9zIHNpZ3VpZW50ZXMgcmVzdWx0YWRvczoNCg0KYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFLCBldmFsID1UUlVFfQ0KbXlsb2dpdCA8LSBnbG0ocmVob3NwX29tcyB+IHBhZ29faG9zcCArIHF1aXJ1ciArICBkaWFzX2hvc3AgKyBlZGFkICsgZ2VuZXJvLCBkYXRhID0gdHJhaW5pbmcsIGZhbWlseSA9ICJiaW5vbWlhbCIpDQpzdW1tYXJ5KG15bG9naXQpDQpgYGANCg0KMS4gQ2FkYSBjYW1iaW8gZW4gdW5hIHVuaWRhZCBlbiBlbCBwYWdvIGhvc3BpdGFsYXJpbyBkaXNtaW51aXLDoSBsYXMgcHJvYmFiaWxpZGFkZXMgZGUgcmVob3NwaXRhbGl6YWNpw7NuLCBwZXJvIGVuIHVuYSBjYW50aWRhZCBtdXkgcGVxdWXDsWEgKC02Ljk1M0UtMDgpDQoyLiBDdWFuZG8gYSB1biBwYWNpZW50ZSBzZSBsZSByZWFsaXphIHVuIHByb2NlZGltaWVudG8gcXVpcsO6cmdpY28gc3UgcHJvYmFiaWxpZGFkIGRlIHF1ZSB0ZXJtaW5lIGhvc3BpdGFsaXphZG8gZGUgbnVldm8gcG9yIGVsIG1pc21vIGRpYWduw7NzdGljbywgZGlzbWludXllIGVuIG3DoXMgZGVsIDE5JSBlbiBjb21wYXJhY2nDs24gYSBjdWFuZG8gbm8gc2UgbGUgcmVhbGl6YSBuaW5ndW5hIGNpcnVnw61hLg0KMy4gTGEgcHJvYmFiaWxpZGFkIGRlIHJlaG9zcGl0YWxpemFjacOzbiBkZWNyZWNlLCBhbCBwZXJtYW5lY2VyIHVuIGTDrWEgYWRpY2lvbmFsIGVsIHBhY2llbnRlIGVuIGxhIFVDRSAoZW4gMS40NSkgeSBsYSBVQ0kgKDEuNzMpDQoNCkVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMgbm8gc29uIHN1ZmljaWVudGVtZW50ZSBleHBsaWNhdGl2YXMgcGFyYSBwcmVkZWNpciwgZGUgbWFuZXJhIHNpZ25pZmljYXRpdmEsIHN1IGVmZWN0byBzb2JyZSBsYSB2YXJpYWJsZSBkZSByZXNwdWVzdGEgYmluYXJpYS4NCg0KRGVzcHXDqXMgZGUgZXN0aW1hZG9zIGxvcyBjb2VmaWNlbnRlcyBzZSBwcm9jZWRlIGEgcmVhbGl6YXIgbGEgcHJlZGljY2nDs24gZGVudHJvIHkgZnVlcmEgZGUgbXVlc3RyYSBwYXJhIGV2YWx1YXIgbGEgcHJlY2lzacOzbiAoYWNjdXJhY3kpIHkgY2FwYWNpZGFkIGRlIGdlbmVyYWxpemFjacOzbiBkZSBudWVzdHJvIG1vZGVsby4gDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCnByZWRfdHJhaW4gPC0gcHJlZGljdChteWxvZ2l0LCBuZXdkYXRhID0gdHJhaW5pbmdbLTddLCB0eXBlID0gInJlc3BvbnNlIikNCnlfcHJlZF90cmFpbiA8LSBpZmVsc2UocHJlZF90cmFpbiA+IDAuNSwgMSwgMCkNCnlfYWN0X3RyYWluIDwtIHRyYWluaW5nJHJlaG9zcF9vbXMNCg0KcHJlZCA9IHByZWRpY3QobXlsb2dpdCwgdHlwZSA9ICdyZXNwb25zZScsIG5ld2RhdGEgPSB0ZXN0aW5nWy03XSkNCnlfcHJlZCA9IGlmZWxzZShwcmVkID4gMC41LCAxLCAwKQ0KeV9hY3QgPC0gdGVzdGluZyRyZWhvc3Bfb21zDQoNCg0Ka2FibGUoZGF0YS5mcmFtZShUcmFpbiA9IG1lYW4oeV9wcmVkX3RyYWluID09IHlfYWN0X3RyYWluKSwgVGVzdCA9IG1lYW4oeV9wcmVkID09IHlfYWN0KSkpICU+JQ0KICBrYWJsZV9zdHlsaW5nKHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIHJvd19sYWJlbF9wb3NpdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpICU+JQ0Kcm93X3NwZWMoMCxiYWNrZ3JvdW5kPSIjRUJGMEY3IikNCiAgDQpgYGANCg0KTG9zIHJlc3VsdGFkb3MgaW5kaWNhbiB1biBuaXZlbCBkZSBhY2N1cmFjeSBzb3NwZWNob3NhbWVudGUgZWxldmFkbywgaW5sdXNvIGVsIG1vZGVsbyBwYXJlY2UgYWp1c3RhcnNlIG1lam9yIGNvbiBsb3MgZGF0b3MgbnVldm9zLCBxdWUgZW4gbGEgcGFydGUgZGUgZW50cmVuYW1pZW50by4gUGFyYSB2ZXIgZW4gZGV0YWxsZSBjb21vIHNlIGNvbXBvcnRhLCBhbCBkaXNjcmltaW5hciBlbnRyZSBsb3MgY2Fzb3MgZW4gcXVlIGVsIHBhY2llbnRlIHNhbGUgZGVmaW5pdGl2YW1lbnRlIG8gdGVybWluYSBlbiB1bmEgcmVob3NwaXRhbGl6YWNpw7NuLCB5IGV2aWRlbmNpYXIgc3UgZGVzZW1wZcOxbyBwb3Igc2VwYXJhZG8sIHNlIGVzdGltYXLDoSBsYSBtYXRyaXogZGUgY29uZnVzacOzbjoNCg0KYGBge3J9DQp0YWJsZShhcy5tYXRyaXgodGVzdGluZ1ssIDddKSwgeV9wcmVkID4gMC41KQ0KYGBgDQoNCkxvcyByZXN1bHRhZG9zIG5vIHBhcmVjZW4gaW5kaWNhciBxdWUgw6lzdGUgY29tcG9ydGFtaWVudG8gc2UgZGVuIGEgY2F1c2EgZGVsIGRlc2JhbGFuY2VvLiBQb3IgdW4gbGFkbyB0ZW5lbW9zIHF1ZSBsYSBzZW5jaWJpbGlkYWQgeSBsYSBlc3BlY2lmaWNpZGFkIGNvcnJlc3BvbmRlbiBhbCA5NiUgeSA5OSUuIFNpIHNlIGhhYmxhIGVuIHTDqXJtaW5vcyBkZSBwcmVjaXNpw7NuLCBzZXLDrWEgZGUgZGUgdW4gOTklIGN1YW5kbyBlcyAwLCBlcyBkZWNpciBkZSB1biB0b3RhbCBkZSAxMDIxOCBwYWNpZW50ZXMgcXVlIG5vIHRlcm1pbmFyb24gZW4gaG9zcGl0YWxpemFjacOzbiBwdWRlIHByZWRlY2lyIGNvbiB1bmEgZXhhY3RpdHVkIHF1ZSBlbCA5OSUgbm8gbG8gaGFyw61hbiwgbWllbnRyYXMgcXVlIGRlIDI0OSBwYWNpZW50ZXMgcXVlIHNpIHR1Ymllcm9uIHVuYSByZWhvc3BpdGFsaXphY2nDs24gcHVkZSBwcmVkZWNpciBxdWUgMjEwIGVmZWN0aXZhbWVudGUgbG8gaGFyw61hbiwgZXMgZGVjaXIsIG1pIHByZWNpc2nDs24gZnVlIGRlbCA4NCUuIA0KDQpTaW4gZW1iYXJnbywgbm8gIHPDs2xvIHBvciBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MgY29uIGVsIGFqdXN0ZSBkZWwgbW9kZWxvLCBzaW5vIHRhbWJpw6luIGNvbiBsbyBxdWUgdmXDrWFtb3MgYW50ZXJpb3JtZW50ZSBlbiBsYSB0YWJsYSBkZWwgdmFsb3IgZGUgbGEgaW5mb3JtYWNpw7NuLCBsYXMgdmFyaWFibGVzIGTDrWFzIFVDSSB5IGTDrWFzIFVDRSBwYXJlY2VuIGV4cGxpY2FyIGRlIG1hbmVyYSBjYXNpIHBlcmZlY3RhIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgb2N1cnJlIHVuIGV2ZW50byByZWhvc3BpdGFsYXJpbyB5IGVzdG8gcHVlZGUgZGViZXJzZSAuLi4uLi4uLiBwb3IgZW5kZSBzZSBkZWNpZGUgZXN0aW1hciBlbCBtb2RlbG8gc2luIGluY2x1aXJsYXMuDQoNCkEgY29udGludWFjacOzbiwgc2Ugb2J0aWVuZW4gbG9zIHJlc3VsdGFkb3M6DQpgYGB7cn0NCm15bG9naXRfMiA8LSBnbG0ocmVob3NwX29tcyB+IHBhZ29faG9zcCArIHF1aXJ1ciArICBkaWFzX2hvc3AgKyBlc3RyYXRvLCBkYXRhID0gdHJhaW5pbmcsIGZhbWlseSA9ICJiaW5vbWlhbCIpDQpzdW1tYXJ5KG15bG9naXQpDQpgYGANCiANCmBgYHtyfQ0KcHJlZF90cmFpbiA8LSBwcmVkaWN0KG15bG9naXRfMiwgbmV3ZGF0YSA9IHRyYWluaW5nWy03XSwgdHlwZSA9ICJyZXNwb25zZSIpDQp5X3ByZWRfdHJhaW4gPC0gaWZlbHNlKHByZWRfdHJhaW4gPiAwLjUsIDEsIDApDQp5X2FjdF90cmFpbiA8LSB0cmFpbmluZyRyZWhvc3Bfb21zDQoNCnByZWQgPSBwcmVkaWN0KG15bG9naXRfMiwgdHlwZSA9ICdyZXNwb25zZScsIG5ld2RhdGEgPSB0ZXN0aW5nWy03XSkNCnlfcHJlZCA9IGlmZWxzZShwcmVkID4gMC41LCAxLCAwKQ0KeV9hY3QgPC0gdGVzdGluZyRyZWhvc3Bfb21zDQoNCg0Ka2FibGUoZGF0YS5mcmFtZShUcmFpbiA9IG1lYW4oeV9wcmVkX3RyYWluID09IHlfYWN0X3RyYWluKSwgVGVzdCA9IG1lYW4oeV9wcmVkID09IHlfYWN0KSkpICU+JQ0KICBrYWJsZV9zdHlsaW5nKHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIHJvd19sYWJlbF9wb3NpdGlvbiA9IDEsDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpICU+JQ0Kcm93X3NwZWMoMCxiYWNrZ3JvdW5kPSIjRUJGMEY3IikNCmBgYA0KDQpgYGB7cn0NCnRhYmxlKGFzLm1hdHJpeCh0ZXN0aW5nWywgN10pLCB5X3ByZWQgPiAwLjUpDQpgYGANCg0KDQpgYGB7cn0NCnRhcHBseShwcmVkX3RyYWluLCB0cmFpbmluZ1ssN10sIEZVTiA9IG1lZGlhbikNCmBgYA0KDQoNCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgZXZhbCA9VFJVRX0NCmxpYnJhcnkoUk9DUikNClJPQ1JwcmVkID0gcHJlZGljdGlvbihwcmVkLCB0ZXN0aW5nJHJlaG9zcF9vbXMpDQogDQojIFBlcmZvcm1hbmNlIGZ1bmN0aW9uDQpST0NScGVyZiA9IHBlcmZvcm1hbmNlKFJPQ1JwcmVkLCAidHByIiwgImZwciIpDQoNCnBlcmYxIDwtIHBlcmZvcm1hbmNlKFJPQ1JwcmVkLCAicHJlYyIsICJyZWMiKQ0KcGxvdChwZXJmMSkNCiANCiMgUGxvdCBST0MgY3VydmUNCnBsb3QoUk9DUnBlcmYpDQojIEFkZCBjb2xvcnMNCnBsb3QoUk9DUnBlcmYsIGNvbG9yaXplPVRSVUUpDQojIEFkZCB0aHJlc2hvbGQgbGFiZWxzIA0KcGxvdChST0NScGVyZiwgY29sb3JpemU9VFJVRSwgcHJpbnQuY3V0b2Zmcy5hdD1zZXEoMCwxLGJ5PTAuMSksIHRleHQuYWRqPWMoLTAuMiwxLjcpKQ0KDQpgYGANCg0KYGBge3J9DQoNClNlbnNpYmlsaWRhZCA9IDIxMC8yMTggDQpTZW5zaWJpbGlkYWQNCg0KZXNwZWNpZmljaWRhZCA9IDEwMjQzLzEwMjUxDQplc3BlY2lmaWNpZGFkDQoNCkFjY3VyYWN5ID0gKDEwMjQzICsgMjEwKS8xMDQ2OQ0KQWNjdXJhY3kNCmBgYA0KDQo=